До сегодняшнего дня я не знал, что в Java есть четыре основных типа ссылок.
- Сильная ссылка : тип ссылки по умолчанию, который использует
Java
. - Слабая ссылка . Если объект имеет слабую ссылку,
GC
освобождает память этого объекта при следующем запуске, даже если памяти достаточно. - Мягкая ссылка . Если объект имеет мягкую ссылку, то
GC
освобождает память этого объекта только тогда, когда ему очень не хватает памяти. - Фантомная ссылка. Если у объекта есть фиктивная ссылка, он подходит для сборки мусора. Но перед сборкой мусора JVM помещает объекты, которые должны быть удалены сборщиком мусора, в очередь с именем
reference queue
.
Я понял основную концепцию и написал небольшую программу, чтобы понять, как работает каждый из ссылочных типов.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
class User
{
public User info()
{
System.out.println("Info method invoked from User class");
return null;
}
}
public class ReferencesExample
{
public static void main(String[] args)
{
//Strong Reference
User userRefObj = new User();
System.out.println("1 :" + userRefObj.info());
// Weak Reference
WeakReference<User> weakref = new WeakReference<User>(userRefObj.info());
System.out.println("2 : " + weakref);
// Soft Reference
SoftReference<User> softref = new SoftReference<User>(userRefObj.info());
System.out.println("3 : " + softref);
// Phantom Reference
ReferenceQueue<User> refQueueObj = new ReferenceQueue<User>();
PhantomReference<User> phantomRef = new PhantomReference<User>(userRefObj.info(),refQueueObj);
System.out.println("4 : " + phantomRef);
}
}
Выход :
1 :null
Info method invoked from User class
Info method invoked from User class
2 : java.lang.ref.WeakReference@15db9742
Info method invoked from User class
3 : java.lang.ref.SoftReference@6d06d69c
Info method invoked from User class
4 : java.lang.ref.PhantomReference@7852e922
Сомнение: как мы решаем, какой тип ссылки использовать и где именно использовать в реальном сценарии?