2015-05-02 3 views
2

Я хав тестового приложения с одним классом, который хранит карту и кнопкой, которая вызывает метод этого класса:GC оленья кожа удалить объекты из WeakHashMap

Map<Object, Object> weakMap = new WeakHashMap<Object, Object>(); 

Кнопка делает это:

public void fillWeakHashMap(int size) { 
    List<String> createObjects = (List<String>) createObject(size); 
    for (Object ob : createObjects) { 
     weakMap.put(ob, ob); 
    } 
} 

Поэтому основной класс с картой живет, но объекты, которые я ему ставил, создаются в отдельном методе, и поскольку это WeakHashMap, я думал, что после выхода из метода fillWeakHashMap ключи/объекты на карте будут очищены GC.

Я открыл VisualVM-> VisualGC и щелкнул Monitor-> PerformGC 10 раз, а старое пространство почти полностью означает, что GC не очищает эти объекты. Так что я делаю неправильно?

+1

Попробуйте использовать 'weakMap.put (ob," ")' вместо 'weakMap.put (ob, ob)'. – RealSkeptic

+0

Спасибо! Я изменил его на weakMap.put (ob, ""), теперь я вижу, что GC работает - некоторые старые объекты удалены, но некоторые объекты в старом пространстве остаются ... Кроме того, я также играю с пространством перггмена, и я использую цикл с операциями 100k +, как новый новый XStream(). fromXML (someXML), который увеличивает pergen в цикле, но GC очищает их. Означает ли это, что я не смогу имитировать исключение PergenSpace? –

ответ

1

Вы сохраняете ссылку для каждого объекта на карте, так как ob все еще ссылается на себя, поэтому ничто не очищается, поскольку GC can not утверждает, что эти объекты не используются и могут быть очищены.

9

Первое предложение JavaDoc says WeakHashMap в:

Хэш таблица на основе реализации интерфейса карты, с слабых ключей. Запись в WeakHashMap будет автоматически удалена, если ее ключ больше не используется обычным образом. Точнее, наличие отображения для данного ключа не будет препятствовать тому, чтобы ключ был отброшен сборщиком мусора, то есть был завершен, финализирован, а затем регенерирован. Когда ключ был отброшен, его запись эффективно удаляется с карты, поэтому этот класс ведет себя несколько иначе, чем другие реализации Map.

и немного дальше вниз, он пишет:

Объекты значения в WeakHashMap проводится обычными сильными ссылками. Таким образом, следует проявлять осторожность, чтобы объекты ценности не сильно ссылались на свои собственные ключи, прямо или косвенно, поскольку это предотвратит отказ ключей.

То есть, только ключи слабо ссылаются, но значения сильно привязаны. В вашем коде каждый ключ также используется значение, поэтому сильно привязаны, и, следовательно, не собираются мусор.

+0

Спасибо! Я изменил его на weakMap.put (ob, ""), теперь я вижу, что GC работает - некоторые старые объекты удалены, но некоторые объекты в старом пространстве остаются ... Кроме того, я также играю с пространством перггмена, и я использую цикл с операциями 100k +, как новый новый XStream(). fromXML (someXML), который увеличивает pergen в цикле, но GC очищает их. Означает ли это, что я не смогу имитировать исключение PergenSpace? –

Смежные вопросы