使用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个

[img]http://dl.iteye.com/upload/attachment/0070/5977/eac592cd-f028-3c9e-a74e-4d5fdf6efcdc.png[/img]

[img]http://dl.iteye.com/upload/attachment/0070/5979/4c3b1bd3-ff15-38ad-8204-a9339bb1c159.png[/img]


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


[img]http://dl.iteye.com/upload/attachment/0070/5981/5b3a48ec-3fb5-3706-a229-167fef440a95.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/0070/5983/63bf22a8-1a86-3055-8405-20c989d1ec9c.png[/img]


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值