Очищается ли WeakHashMap во время полной сборки мусора?

У меня возникли проблемы с WeakHashMap.

Рассмотрим этот пример кода:

List<byte[]> list = new ArrayList<byte[]>();

Map<String, Calendar> map = new WeakHashMap<String, Calendar>();
String anObject = new String("string 1");
String anOtherObject = new String("string 2");

map.put(anObject, Calendar.getInstance());
map.put(anOtherObject, Calendar.getInstance());
// In order to test if the weakHashMap works, i remove the StrongReference in this object
anObject = null;
int i = 0;
while (map.size() == 2) {
   byte[] tab = new byte[10000];
   System.out.println("iteration " + i++ + "map size :" + map.size());
   list.add(tab);
}
System.out.println("Map size " + map.size());

Этот код работает. Внутри циклов я создаю объект. Когда происходит второстепенный сборщик мусора, размер карты равен 1 на 1360-й итерации. Все в порядке.

Теперь, когда я прокомментирую эту строку:

//anObject = null; 

Я ожидаю, что у меня будет OutOfMemoryError, потому что mapSize всегда равен 2. Однако на 26XXX-й итерации происходит полный сборщик мусора и размер карты равен 0. Я не знаю. понимаю, почему?

Я подумал, что карту не следовало очищать, потому что есть сильные ссылки на оба объекта.

11
задан Michael Berry 11 January 2012 в 15:35
поделиться