Слабая ссылка
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/WeakReference.html
Принцип: weak reference
связан со сборкой мусора. Обычно объект, имеющий один или несколько reference
, не будет иметь права на сборку мусора.
Вышеуказанный принцип неприменим, если он weak reference
. Если объект имеет слабую ссылку на другие объекты, он готов к сборке мусора.
Давайте посмотрим на приведенный ниже пример: у нас есть Map
с объектами, где ключ является ссылкой на объект.
import java.util.HashMap;
public class Test {
public static void main(String args[]) {
HashMap<Employee, EmployeeVal> aMap = new
HashMap<Employee, EmployeeVal>();
Employee emp = new Employee("Vinoth");
EmployeeVal val = new EmployeeVal("Programmer");
aMap.put(emp, val);
emp = null;
System.gc();
System.out.println("Size of Map" + aMap.size());
}
}
Теперь, во время выполнения программы мы сделали emp = null
. Map
, удерживающий клавишу, здесь не имеет смысла, так как это null
. В описанной выше ситуации объект не является сборщиком мусора.
WeakHashMap
WeakHashMap
- это место, где записи (key-to-value mappings
) будут удалены, когда их больше невозможно будет извлечь из Map
.
Позвольте мне показать тот же пример с WeakHashMap
import java.util.WeakHashMap;
public class Test {
public static void main(String args[]) {
WeakHashMap<Employee, EmployeeVal> aMap =
new WeakHashMap<Employee, EmployeeVal>();
Employee emp = new Employee("Vinoth");
EmployeeVal val = new EmployeeVal("Programmer");
aMap.put(emp, val);
emp = null;
System.gc();
int count = 0;
while (0 != aMap.size()) {
++count;
System.gc();
}
System.out.println("Took " + count
+ " calls to System.gc() to result in weakHashMap size of : "
+ aMap.size());
}
}
Вывод: Взял 20 calls to System.gc()
, чтобы получить aMap size
из: 0.
WeakHashMap
имеет только слабые ссылки на ключи, а не сильные ссылки, как другие Map
классы. Существуют ситуации, о которых вы должны позаботиться, когда на значение или ключ строго ссылаются, хотя вы использовали WeakHashMap
. Этого можно избежать, поместив объект в WeakReference .
import java.lang.ref.WeakReference;
import java.util.HashMap;
public class Test {
public static void main(String args[]) {
HashMap<Employee, EmployeeVal> map =
new HashMap<Employee, EmployeeVal>();
WeakReference<HashMap<Employee, EmployeeVal>> aMap =
new WeakReference<HashMap<Employee, EmployeeVal>>(
map);
map = null;
while (null != aMap.get()) {
aMap.get().put(new Employee("Vinoth"),
new EmployeeVal("Programmer"));
System.out.println("Size of aMap " + aMap.get().size());
System.gc();
}
System.out.println("Its garbage collected");
}
}
Мягкие ссылки.
Soft Reference
немного сильнее, чем слабая ссылка. Мягкая ссылка позволяет собирать мусор, но просит сборщик мусора очистить его, только если нет другой опции.
Сборщик мусора не собирает агрессивно доступные объекты, как это происходит со слабо достижимыми объектами, - он собирает объекты с низким уровнем доступности, только если ему действительно «нужна» память. Мягкие ссылки - это способ сказать сборщику мусора: «Пока память не слишком тесная, я бы хотел сохранить этот объект. Но если память становится действительно тесной, продолжайте собирать ее, и я буду иметь дело с этим. " Сборщик мусора должен очистить все мягкие ссылки, прежде чем он сможет выбросить OutOfMemoryError
.