使用visualvm工具分析Ehcache缓存中内存回收机制

这几天发现现网几台服务器的应用有内存泄露的现象,对其中缓存中各个对象数据进行检查,发现ehcache对象数量是2万多个,查询业务表中发现商用状态的业务数据还不到1万。
自己就写一段代码使用visualvm工具。对Ehcache中对象回收机制进行分析
  
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        CacheManager cacheManager = CacheManager.getInstance();
        long startTime = System.currentTimeMillis();
        println "startTime is " + new Date();
        Cache cache = new Cache("test",4,false,false,5,5);
        cacheManager.addCache(cache);
        cache = cacheManager.getCache("test");
        5.times {
            cache.put(new Element("k$it",new GameServiceVo()));
        }
        println "cache size=" + cache.size + ",keys="+cache.keys+",millis is " + (System.currentTimeMillis()-startTime);
        reader.readLine();
        println "cache size=" + cache.size + ",keys="+cache.keys+",millis is " + (System.currentTimeMillis()-startTime);
        3.times {
            println cache.get("k$it")?.value;
        }
        reader.readLine();
        println "cache size=" + cache.size  + ",keys="+cache.keys+",millis is " + (System.currentTimeMillis()-startTime);
        4.times {
                    cache.put(new Element("k$it",it));
         }
        println "cache size=" + cache.size  + ",keys="+cache.keys+",millis is " + (System.currentTimeMillis()-startTime);
        reader.readLine();
    


    先限定cache中只能放4个对象,生命周期5秒。放入5个GameServiceVo对象,过几十秒秒后检查一下jvm中GameServiceVo对象个数,还是4个






    说明对象未释放,接着读取其中2个对象,得到都是Null,再检查一下jvm中GameServiceVo对象个数,是2个




    再重新放入4个Integer对象,再检查一下jvm中GameServiceVo对象个数,是0个,全部被回收




    Ehcache中对象可以被回收需要以下条件:
1、对象已经过期,被读取一次会删除对象的引用
2、缓存已满,根据清除策略,被清除的对象会被回收
   所以使用ehcache时设置缓存大小时不是越大越好,否则有可能造成ehcache占用内存越来越大,直到缓存已满才能触发对象回收
  

猜你喜欢

转载自bloodwolf-china.iteye.com/blog/1585010