您好,登錄后才能下訂單哦!
本篇內容介紹了“java堆的內存模型介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
根據對象存活的特點以及使垃圾回收產生算法產生最大的收益,將堆區分為兩大塊,一個是Old區,一個是Young區。Young區分為兩大塊,一個是Survivor區(S0+S1),一塊是Eden區。S0和S1一樣大,也可以叫From和To。
一般情況下,新創建的對象都會被分配到Eden區,一些特殊的大的對象會直接分配到Old區。
比如有對象A,B,C等創建在Eden區,但是Eden區的內存空間肯定有限,比如有100M,假如已經使用了
100M或者達到一個設定的臨界值,這時候就需要對Eden內存空間進行清理,即垃圾收集(GarbageCollect),
這樣的GC我們稱之為MinorGC,MinorGC指得是Young區的GC。經過GC之后,有些對象就會被清理掉,有些對象可能還存活著,對于存活著的對象需要將其復制到Survivor區,然后再清空Eden區中的這些對象。
下面根據垃圾收集算法
詳細講解下為什么要分為surivor0和surivor1,難道一個survivor區不行嗎?
假設只有一個s0區,eden區回收之后,一部分對象存放到了s0區,此時eden區空間全部釋放,內存都是連續的。但是因為s0區也會進行垃圾回收,它有一部分存活的對象進入到了Old區,還有一部分對象存活留下來,這時候s0區就產生了內存碎片,為了使s0區的內存空間相對連續,再分配一個s1區,大小和s0一樣,每次垃圾回收的時候,將eden區和s0區存活的對象移動到s1區,這樣永遠都能保證s0或者s1的內存空間是連續的。當然,這樣的情況下會使得s0或者s1區有一個空間永遠為空,浪費10%的內存空間,當然為了最大化的利用young區,這樣的浪費是被接受的。所以,young區一次GC流程是這樣的:在同一個時間點上,S0和S1只能有一個區有數據,另外一個是空的。假設s0區有數據,此時進行一次GC操作,s0區中對象的年齡就會+1,而Eden區中所有存活的對象會被復制到是s1區,s0區中還能存活的對象會有兩個去處。若對象年齡達到之前設置好的年齡閾值,此時對象會被移動到Old區,Eden區和s0區沒有達到閾值的對象會被復制到s1區,s0區將又會變為空的。
“java堆的內存模型介紹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。