java - Java 静态变量的垃圾收集 - 内存不足

标签 java memory-leaks garbage-collection

我们有一个应用程序,可以完全缓存大量数据。缓存以静态 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/

相关文章:

java - 马拉松OSS : How to inspect elements on JAVA Swing GUI

mysql - 在 Amazon RDS/Mysql 中解释这种内存消耗模式?

memory-leaks - Valgrind vs Purify

Java 大型多人游戏服务器可扩展性

sockets - Javamail不会在超时时完全关闭套接字

java - Scala:如何进行字符串连接以避免 GC 开销问题

java - 定义/设置 JComboBox BasicArrowButton 禁用时的颜色

javascript - 无法在javascript中访问java变量

java - 运行 Hibernate 时出现 XML 解析错误

ios - 追踪低内存警告的根本原因