关于JVM垃圾回收

最近在写web程序,根据需要写了一个缓存,用HashMap做的,大概如下

public class XXCache{ 
   private HashMap<String,String> cache = new HashMap<>();    
   ...   
    ...
    method(){
        int i=0;      
          ...
    }
}

这个web程序run了两天没有任何请求,两条后我去操作这个缓存,其中的数据还在(缓存策略不会清除数据),当然如果不在的话就出问题了。
我的问题是为什么这个cache对象不会被JVM垃圾回收掉呢,是不是类对象不会轻易被回收呢,像method方法中的i局部变量是不是用完过后会马上被回收掉呢?
看过JVM相关的垃圾回收机制,当时感觉懂了,不过一看具体问题感觉还是不明白


幕布斯6054654
浏览 893回答 2
2回答

慕莱坞森

"一般情况下,JVM在堆空间不够用了的时候才会开始回收" --什么是G1GC? 要不你打开VisualVM监控一下

当年话下

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