我们有一个应用程序,可以完全缓存大量数据。缓存以静态 map 的形式维护。
由于每天都会通过一些批处理周期修改数据,因此我们在数据修改后刷新缓存。 刷新缓存是通过创建新对象并将静态变量引用到这些新对象来完成的。因此每天都会创建新对象并取消引用旧对象。
但问题是服务器堆内存不断增加,直到有一天它在没有内存异常的情况下崩溃了。
我真的怀疑取消引用的对象是否被垃圾收集。
这是我的课。
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() 来更新缓存。 谁能帮我实现缓存而不出现这个问题。
最佳答案
我怀疑旧 map 仍在某处被引用。我建议您尝试以下操作(不要每次都创建新 map ,而是简单地清除现有 map 并重新填充它):
public docache(){
if(articleCache!= null){
//clear the elements of existing map
articleCache.clear();
}else{
articleCache = new HashMap();
}
//do the map population
}
如果这也不起作用,则在崩溃之前拍摄内存快照并检查哪些确切对象正在消耗您的堆。这将使您对这个问题有更好的了解。
关于java - Java 静态变量的垃圾收集 - 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521261/