下面的类是在init()
servlet 的方法上初始化的。
objA
仅用于读取,refreshA
需要定期调用 - 方法以将其替换为A
.
问题:定期更新后,出现内存泄漏。(我猜有一些悬空引用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 应该删除旧的引用。