自己就写一段代码使用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占用内存越来越大,直到缓存已满才能触发对象回收