2

我们有一个应用程序可以完全缓存大量数据。缓存作为静态映射维护。

由于数据每天都会被一些批处理周期修改,所以我们在数据修改后刷新缓存。刷新缓存是通过创建新对象并将静态变量引用到这些新对象来完成的。因此,每天都会创建新对象并取消引用旧对象。

但问题是服务器堆内存不断增加,直到有一天它崩溃而没有内存异常。

我真的怀疑取消引用的对象是否被垃圾收集。

这是我的课。

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() 来更新缓存。任何人都可以帮助我在没有这个问题的情况下实现缓存。

4

2 回答 2

2

我怀疑旧地图仍然在某处被引用。我建议您在下面尝试(不要每次都创建新地图,而是简单地清除现有地图并重新填充它):

      public docache(){ 
           if(articleCache!= null){
                 //clear the elements of existing map
                 articleCache.clear();
           }else{
                 articleCache = new HashMap();
           }
           //do the map population
      }

如果这也不起作用,那么在崩溃之前拍摄内存快照并检查哪些确切的对象正在消耗您的堆。这将更好地了解这个问题。

于 2012-11-22T23:26:30.687 回答
1

尝试使用映射的 java.util.WeakHashMap。当您的对象不再被其他地方引用时,WeakHashMap 中的条目将被自动删除。

于 2014-11-19T17:40:22.770 回答