2015-08-30 2 views
0

Я читал литературу по WeakReference в Java API документации для Java 7 и попытались проверить то же самое со следующимGC для WeakReference и StrongReference в Java

package com.finalize; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.WeakHashMap; 

public class WeakRefernceTest { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String x = new String("x1"); 
     String y = new String("x2"); 

     Map<String, Object> mw = new WeakHashMap<>(); 
     mw.put(x, new Object()); 

     Map<String, Object> m = new HashMap<>(); 
     m.put(y, new Object()); 

     x = null; 
     y = null; 

     for(int i = 0; i < 5;++i) 
     System.gc(); 

     System.out.println(mw.size()); 
     System.out.println(m.size()); 

    } 

} 

Когда я запустил его несколько раз, я мог видеть что mw.size() был напечатан как 0. Но я немного смущен, потому что m.size() никогда не печатается как 0. Поэтому в основном я пытаюсь понять GC по умолчанию, который запускался в этой горячей точке jvm. Поэтому, когда GC начинает отмечать доступные объекты и запускается после того, как x и y заданы как null, почему он указывает объект, на который ссылается y, как достижимый, потому что y был установлен как null? Даже если корневая переменная задана как m, почему GC когда-либо достигает объекта, ранее указанного y, и объявляет его доступным?

Напротив, какова подробная последовательность изменений жизненного цикла на x?

ответ

0

Вы выполняете основной метод в основном потоке. Основной поток имеет переменную m на стеке. Эта переменная m является ссылкой на экземпляр HashMap. Этот экземпляр HashMap имеет ссылку на массив записей карты. Уникальная запись в карте, содержащаяся в этом массиве, имеет ссылку на ключ «x2» и соответствующий объект.

Таким образом, существует целая цепочка ссылок, идущая от корня (основного стека потока) к объекту, хранящемуся на карте. Это мешает GC собирать объект на карте.

thread stack -> m -> HashMap -> entries -> entry -> "x2" 
               -> Object 

То же самое относится и к другой карте, а другой объект, кроме это WeakHashMap, так, так как ключ карта слабая ссылка и является единственной ссылкой слева, что указывает на «x1», ГХ разрешено собирать ссылку на «x1». И как только GC собрал его, карта удаляет соответствующую запись из своего массива.

+0

Вопрос только в том, что цепочка выше отражает entry-> x2 вместо entry-> y-> null, что означало бы, что «x2» может быть собрано, а также второй частью моего вопроса была подробная последовательность, и я хотел понять, где в цепочке объект переходит к ReferenceQueue и что происходит тогда. Извините, если это не ясно из вопроса. – 100pipers

+0

Вы в замешательстве. Просто потому, что вы устанавливаете y в null, это не означает, что ключ в hashmap становится нулевым. Когда вы ставите y в качестве ключа на карте, карта получает копию ссылки и сохраняет ее в одной из своих записей. Установка y в значение null делает y не указаным, но запись на карте по-прежнему ссылается на строку «x2». Java передается по значению. –

+0

Вы правы, я думаю, что пропустил точку здесь. Не могли бы вы также ответить на вторую половину вопроса о том, где в цепочке объект (указываемый ранее с помощью слабой ссылки) переходит к ReferenceQueue и что происходит дальше? Спасибо, я приму ответ и закрою его. Причина, по которой я подчеркиваю это, состоит в том, что у меня может быть связанный вопрос с ответом !! Но спасибо!! – 100pipers

0

Пошагового кода

  • вы делаете копию строки "x2" и присвоить это y
  • вы добавляете строку "x2" в качестве ключа в m
  • при GC, m достижим , как и все его ключи.
  • после GC, m и все его ключи сохранены.
Смежные вопросы