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