У меня есть простой фрагмент:
Integer integer = 2;
WeakReference<Integer> wi = new WeakReference<>(integer);
WeakReference<Integer> sr = new WeakReference<>(new Integer(3));
System.out.println(wi.get());
System.out.println(sr.get());
System.gc();
System.out.println("step 1 wi = " + wi.get());
System.out.println("step 1 sr =: " + sr.get());
integer = null;
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("step 1 wi = " + wi.get());
System.out.println("step 1 sr =: " + sr.get());
Вызов «System.gc()» должен заставить все слабые ссылки быть переработанными, правильно, и я даже подождал 1 секунду, чтобы убедиться, что gc() происходит. Но даже когда установлено «integer = null», «wi» отказывается быть нулевым. В то время как sr имеет значение null сразу после "System.gc()". Он печатает:
2
3
step 1 wi = 2
step 1 sr =: null
step 1 wi = 2
step 1 sr =: null
Мои вопросы: (1) В чем основная разница между wi и sr? (2) как заставить jvm перерабатывать wi?
Большое спасибо.