Если я запускаю эту программу с -mx40m
char[] chars = new char[4096];
List<SoftReference<String>> strings = new ArrayList<SoftReference<String>>();
do {
strings.add(new SoftReference<String>(new String(chars)));
} while(strings.get(0).get()!=null);
int nulls=0, set=0;
for (SoftReference<String> string : strings) {
if(string.get() == null) nulls++; else set++;
}
System.out.println("nulls= "+nulls+", was still set= "+set);
, я получаю
nulls= 4618, was still set= 1
Одна из проблем, связанных с WeakReferences и SoftReferences, заключается в том, что они, как правило, удаляются сразу..
Попробуйте WeakReference, SoftReferences понятны, только если это действительно необходимо.Чтобы сделать их более понятными, попробуйте создать достаточно большой массив, чтобы вызвать ошибку OutOfMemoryError.
Все объекты находятся в куче.Даже статические поля обернуты в псевдообъект, который находится в куче.(Это более позднее поведение не определено, но, как я видел, оно работает)
Ссылочный экземпляр освобождается после того, как он был удален (как и любой другой объект)