我们有一个应用程序,我们完全缓存大量数据。缓存维护为静态地图。
由于数据每天都会被某些批处理周期修改,因此我们会在修改数据后刷新缓存。 刷新缓存是通过创建新对象并将静态变量引用到这些新对象来完成的。因此,每天都会创建新对象,并取消引用旧对象。
但问题是服务器堆内存不断增加,直到有一天崩溃而没有内存异常。
我真的怀疑解除引用的对象是否被垃圾收集。
这是我的班级。
Class CacheService {
public static Map<String,Article> articleCache = null;
public docache(){
private Map<String,Article> tempArticleCache= new HashMap<String,Article>();
//Caching stuff
//finally
articleCache = tempArticleCache; // i hope defreferencing takes place here.
}
}
每天调用函数docache()来更新缓存。 没有这个问题,任何人都可以帮助我实现缓存。
答案 0 :(得分:2)
我怀疑旧地图仍然在某处被引用。我建议你在下面尝试(不是每次都创建一个新地图,而是简单地清除现有地图并重新填充它):
public docache(){
if(articleCache!= null){
//clear the elements of existing map
articleCache.clear();
}else{
articleCache = new HashMap();
}
//do the map population
}
如果这也不起作用,那么在崩溃之前获取内存快照并检查哪些确切的对象正在消耗您的堆。这样可以更好地了解这个问题。
答案 1 :(得分:1)
尝试使用Maps的java.util.WeakHashMap。当您的对象不再在其他地方被引用时,WeakHashMap中的条目将被自动删除。