Этот класс инициализируется методом init()
сервлета. objA
используется только для чтения, необходимо периодически вызывать метод, чтобы заменить его новым экземпляром A
.Замена объектов Java во время выполнения
Проблема: После периодических обновлений появляется утечка памяти. (Я предполагаю, что есть
некоторые повисшие ссылки
несколько копий A
существующего)
public Class A {
private static volatile A objA;
public static A getA(){
if(objA == null){
synchronized (A.class){
if(objA == null){
objA = new A(); //takes a long time to initialise and memory heavy
return objA;
}
}
}
return objA;
}
public static void refreshA (A newObjA){
// best way to do this ?
/*
objA = newObjA;
*/
}
}
Вид Hacky:
Я мог бы использовать ConcurrentHashMap<String,A> -> get("OBJ-A"), replace("OBJ-A", newObjA)
это будет использовать ReentrantReadWriteLock но Я еще не пробовал.
Так что было бы лучшим способом реализовать refreshA()
? Помня о том, что GC должен удалить старую ссылку.
Если старый объект не собирается, это связано с тем, что он связан откуда-то еще. (Но, конечно, многие подозреваемые «утечки памяти» объясняются только тем, как работает GC - куча растет до тех пор, пока не будет достигнут предел, а затем собирается.) –
Просто синхронизация на A.class и установка ссылки достаточно здесь , @HotLicks прав, ваша проблема не в этом классе. – Kayaman
Здесь не обнаружено утечки. Подумайте о большей картине. Как другие классы используют результат getA()? Кроме того, если A - тяжелый объект для создания, почему бы не обновить его, заменив его, а не копируя состояния из других объектов/источников в objA? –