Ссылка против объекта
Ссылка – это информация о местоположении объекта. Ссылка хранится в памяти стека, а фактический объект хранится в памяти кучи JVM.

Когда вы присваиваете ссылку другой ссылке, другая ссылка будет ссылаться на тот же объект в куче.

В Java существует четыре типа ссылок. Каждый ссылочный тип различается по способу, которым они собираются мусором.
1. Сильная ссылка
По умолчанию, когда вы создаете объект и прямо указываете его на переменную, он содержит строгую ссылку на объект. Любой объект, имеющий сильную ссылку, не подходит для сборки мусора. Объект удаляется сборщиком мусора только тогда, когда переменная указывает на значение null или больше недоступна или на нее не ссылаются какие-либо потоки.

2. Слабая ссылка
Если объект имеет слабую ссылку, он будет удален из памяти во время сборки мусора, даже если в куче достаточно памяти доступно.
Мы можем создать слабую ссылку, используя classWeakReference
import java.lang.ref.WeakReference;
//...
WeakReference<Person> weakPerson = new WeakReference<>(new Person("abc", 12));
System.out.println(weakPerson.get()); // com.test.Person@36baf30c
System.gc();
Thread.sleep(5000); // Allow some time for gc
System.out.println(weakPerson.get()); // null. The object is garbage collected!
WeakReference полезен для реализации структуры данных, подобной кэшу в памяти, с использованием HashMap с ключами типа WeakReference. Затем записи, на которые больше нет ссылок, будут удалены сборщиком мусора во время следующего цикла GC.
3. Мягкая ссылка
Объекты с программными ссылками будут сохраняться в памяти во время сборки мусора, когда памяти будет достаточно. Они будут удалены только когда у JVM закончится память.
Мы можем создать мягкую ссылку, используя classSoftReference
import java.lang.ref.SoftReference;
//...
SoftReference<Person> softPerson = new SoftReference<>(new Person("abc", 12));
System.out.println(softPerson.get()); // com.test.Person@36baf30c
System.gc();
Thread.sleep(5000); // Allow some time for gc
System.out.println(softPerson.get()); // com.test.Person@36baf30c
// The output depends on available memory in the JVM. If there is enough memory available,
// then the object will be retained, otherwise the object will be removed during the GC and this will print 'null'
4. Фантомная ссылка
Последний тип ссылки — это фантомная ссылка. Объекты, на которые ссылаются фантомные ссылки, подлежат сборке мусора. Однако JVM помещает их в очередь, называемую «справочной очередью», прежде чем удалять их из памяти. Они помещаются в очередь ссылок после вызова для них метода finalize().
Существует два основных варианта использования:
а). Чтобы определить, когда объект был удален из памяти, это помогает планировать задачи, чувствительные к памяти. Например, мы можем дождаться удаления большого объекта, прежде чем загружать другой.
б). Чтобы избежать использования метода finalize и улучшить процесс финализации.
Мы можем создать фантомную ссылку, используя classPhantomReference
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
//...
ReferenceQueue<Person> refQueue = new ReferenceQueue<>();
PhantomReference<Person> phantomPerson = new PhantomReference<>(new Person("abc", 12), refQueue);
System.out.println(phantomPerson.get()); // null. Phantom object is always inaccessible.
System.out.println(refQueue.poll()); // null. No elements in the ref-queue yet.
System.gc();
Thread.sleep(5000); // Allow some time for gc
System.out.println(phantomPerson.get()); // null
System.out.println(refQueue.poll()); // java.lang.ref.PhantomReference@36baf30c - Since the object is gc'd, it's now available in the refQueue.
Заключение
Вышеупомянутые ссылки обеспечивают доступ к расширенному управлению памятью. Эти функции позволяют нам динамически изменять поведение сборщика мусора.