为了账号安全,请及时绑定邮箱和手机立即绑定

关于JVM垃圾回收

关于JVM垃圾回收

鸿蒙传说 2019-03-30 09:33:16
最近在写web程序,根据需要写了一个缓存,用HashMap做的,大概如下publicclassXXCache{privateHashMapcache=newHashMap();......method(){inti=0;...}}这个web程序run了两天没有任何请求,两条后我去操作这个缓存,其中的数据还在(缓存策略不会清除数据),当然如果不在的话就出问题了。我的问题是为什么这个cache对象不会被JVM垃圾回收掉呢,是不是类对象不会轻易被回收呢,像method方法中的i局部变量是不是用完过后会马上被回收掉呢?看过JVM相关的垃圾回收机制,当时感觉懂了,不过一看具体问题感觉还是不明白
查看完整描述

2 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

这里的i是个primitive。他应该是存在栈上的,不在堆上。所以木有垃圾回收一说(当然,方法一返回,i内存位置的那个数据就不可靠了,可以说被“回收”了)。
没大看懂那个cache的问题。一般情况下,JVM在堆空间不够用了的时候才会开始回收。如果你的堆的最大空间(Xmx)设置的非常大,则JVM通常会扩展堆大小,而不是回收垃圾。因为回收垃圾总是要耗CPU的。这终究跟JVM的实现细节有关。
垃圾回收是这样的,如果你的程序没有任何办法访问到那个对象了,那么这个对象就可以被回收了。若你创建了一个XXCache对象,他内部就包含对那个HashMap的引用,如果你还能访问那个类别为XXCache的对象,这就说明你可以访问那个HashMap,JVM就不会贸然把cache给回收掉。
如果你的程序访问不到那个XXCache对象了,而且也没有对cache的其他引用。那cache就随时有可能被回收。
                            
查看完整回答
反对 回复 2019-03-30
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

"一般情况下,JVM在堆空间不够用了的时候才会开始回收"--什么是G1GC?要不你打开VisualVM监控一下
                            
查看完整回答
反对 回复 2019-03-30
  • 2 回答
  • 0 关注
  • 375 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号