Вы используете SoftReference , когда хотите, чтобы указанный объект оставался в живых до тех пор, пока процесс хоста не исчерпает память. Объект не будет пригоден для сбора, пока сборщику не понадобится освободить память. Проще говоря, привязка SoftReference означает «Закрепить объект, пока вы больше не сможете».
В отличие от этого, используйте WeakReference , если вы не хотите влиять на время жизни ссылочного объекта; Вы просто хотите сделать отдельное утверждение о ссылочном объекте, пока он остается живым. Право объекта на сбор не зависит от наличия привязанных WeakReferences. Нечто похожее на внешнее сопоставление экземпляра объекта и связанного свойства, где свойство нужно записывать только до тех пор, пока связанный объект жив, хорошо подходит для WeakReferences и WeakHashMap.
Последний - PhantomReference - сложнее охарактеризовать. Как и WeakReference, такая привязка PhantomReference не оказывает влияния на время жизни ссылочного объекта. Но в отличие от других ссылочных типов, невозможно даже разыменовать PhantomReference. В некотором смысле, это не указывает на то, на что он указывает, насколько звонящие могут сказать. Он просто позволяет связать некоторые связанные данные со ссылочным объектом - данные, которые впоследствии могут быть проверены и обработаны, когда PhantomReference ставится в очередь в связанном ReferenceQueue. Обычно каждый получает тип из PhantomReference и включает некоторые дополнительные данные в этот производный тип. К сожалению, для использования такого производного типа требуется некоторое уныние.
больше информации в этой ссылке
http://download.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html
Добавлена еще одна ссылка
http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html