幕布斯6054654
2018-10-18 21:43:45
最近在寫web程序,根據(jù)需要寫了一個緩存,用HashMap做的,大概如下public class XXCache{
private HashMap<String,String> cache = new HashMap<>();
...
...
method(){
int i=0;
...
}
}這個web程序run了兩天沒有任何請求,兩條后我去操作這個緩存,其中的數(shù)據(jù)還在(緩存策略不會清除數(shù)據(jù)),當(dāng)然如果不在的話就出問題了。我的問題是為什么這個cache對象不會被JVM垃圾回收掉呢,是不是類對象不會輕易被回收呢,像method方法中的i局部變量是不是用完過后會馬上被回收掉呢?看過JVM相關(guān)的垃圾回收機(jī)制,當(dāng)時感覺懂了,不過一看具體問題感覺還是不明白
2 回答

當(dāng)年話下
TA貢獻(xiàn)1890條經(jīng)驗 獲得超9個贊
這里的i是個primitive。他應(yīng)該是存在棧上的,不在堆上。所以木有垃圾回收一說(當(dāng)然,方法一返回,i內(nèi)存位置的那個數(shù)據(jù)就不可靠了,可以說被“回收”了)。
沒大看懂那個cache的問題。一般情況下,JVM在堆空間不夠用了的時候才會開始回收。如果你的堆的最大空間(Xmx)設(shè)置的非常大,則JVM通常會擴(kuò)展堆大小,而不是回收垃圾。因為回收垃圾總是要耗CPU的。這終究跟JVM的實現(xiàn)細(xì)節(jié)有關(guān)。
垃圾回收是這樣的,如果你的程序沒有任何辦法訪問到那個對象了,那么這個對象就可以被回收了。若你創(chuàng)建了一個XXCache對象,他內(nèi)部就包含對那個HashMap的引用,如果你還能訪問那個類別為XXCache的對象,這就說明你可以訪問那個HashMap,JVM就不會貿(mào)然把cache給回收掉。
如果你的程序訪問不到那個XXCache對象了,而且也沒有對cache的其他引用。那cache就隨時有可能被回收。
添加回答
舉報
0/150
提交
取消