關於虛擬機器中堆記憶體結構的詳解
阿新 • • 發佈:2019-01-25
新建的物件會放在年輕帶裡面,年輕代填滿會觸發minor gc,minor gc會清除包括s0,s1在內的所有年輕代裡面不用的垃圾。
Eden(伊甸園)裡面沒有被清除的物件就是倖存下來的,就會被放入s0或者s1中,每次所有幸存物件必須放入一個survivor space區域,意味著必須有一個survivor space是空的。物件上面的數字代表他的年齡,即倖存的次數,每次倖存以後都會換survivor space,並且年齡+1.
所以每執行一次minor GC,倖存的物件就會從一個survivor space跳到另外一個survivor space。並且年齡+1.如下圖。
當倖存物件的年齡到達某個值後,就會從年輕代進入老年代。如下圖以 8為例。
永恆代,放常用庫檔案和方法
Eden和survivor的比例為8:1,老年代比年輕代記憶體大。如果老年代記憶體滿了,就會觸發major GC或者full GC。觸發full GC就會出現所謂的STW(stop the world)現象。即所有的程序都掛起等待清理垃圾。
major GC是回收老年代的垃圾。Full GC是回收老年代和年輕代的垃圾。
許多Java的垃圾收集器都使用了引用的根集,作為分析物件存活與否的依據。引用的根集是正在執行的Java程式隨時都可以訪問引用的變數的集合——也就是存在堆疊或是靜態儲存空間上的引用變數。從這些根集變量出發可直接或是間接到達的物件,垃圾收集器會認為這些物件是生命尚存的物件;相對的從這些根集變量出發通過任意途徑都無法到達的物件,就是死亡的,它們就會成為下一次垃圾收集的物件。