對jvm堆中年輕代,老年代,永久代的理解
1.為什麼會有年輕代
我們先來屢屢,為什麼需要把堆分代?不分代不能完成他所做的事情麼?其實不分代完全可以,分代的唯一理由就是優化GC效能。你先想想,如果沒有分代,那我們所有的物件都在一塊,GC的時候我們要找到哪些物件沒用,這樣就會對堆的所有區域進行掃描。而我們的很多物件都是朝生夕死的,如果分代的話,我們把新建立的物件放到某一地方,當GC的時候先把這塊存“朝生夕死”物件的區域進行回收,這樣就會騰出很大的空間出來。
2.年輕代中的GC
HotSpot JVM把年輕代分為了三部分:1個Eden區和2個Survivor區(分別叫from和to)。預設比例為8:1,為啥預設會是這個比例,接下來我們會聊到。一般情況下,新建立的物件都會被分配到Eden區(一些大物件特殊處理),這些物件經過第一次Minor GC後,如果仍然存活,將會被移到Survivor區。物件在Survivor區中每熬過一次Minor GC,年齡就會增加1歲,當它的年齡增加到一定程度時,就會被移動到年老代中。
因為年輕代中的物件基本都是朝生夕死的(80%以上),所以在年輕代的垃圾回收演算法使用的是複製演算法,複製演算法的基本思想就是將記憶體分為兩塊,每次只用其中一塊,當這一塊記憶體用完,就將還活著的物件複製到另外一塊上面。複製演算法不會產生記憶體碎片。
在GC開始的時候,物件只會存在於Eden區和名為“From”的Survivor區,Survivor區“To”是空的。緊接著進行GC,Eden區中所有存活的物件都會被複制到“To”,而在“From”區中,仍存活的物件會根據他們的年齡值來決定去向。年齡達到一定值(年齡閾值,可以通過-XX:MaxTenuringThreshold來設定)的物件會被移動到年老代中,沒有達到閾值的物件會被複制到“To”區域。經過這次GC後,Eden區和From區已經被清空。這個時候,“From”和“To”會交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎樣,都會保證名為To的Survivor區域是空的。Minor GC會一直重複這樣的過程,直到“To”區被填滿,“To”區被填滿之後,會將所有物件移動到年老代中。
3.一個物件的這一輩子
我是一個普通的java物件,我出生在Eden區,在Eden區我還看到和我長的很像的小兄弟,我們在Eden區中玩了挺長時間。有一天Eden區中的人實在是太多了,我就被迫去了Survivor區的“From”區,自從去了Survivor區,我就開始漂了,有時候在Survivor的“From”區,有時候在Survivor的“To”區,居無定所。直到我18歲的時候,爸爸說我成人了,該去社會上闖闖了。於是我就去了年老代那邊,年老代裡,人很多,並且年齡都挺大的,我在這裡也認識了很多人。在年老代裡,我生活了20年(每次GC加一歲),然後被回收。
4.有關年輕代的JVM引數
1)-XX:NewSize和-XX:MaxNewSize
用於設定年輕代的大小,建議設為整個堆大小的1/3或者1/4,兩個值設為一樣大。
2)-XX:SurvivorRatio
用於設定Eden和其中一個Survivor的比值,這個值也比較重要。
3)-XX:+PrintTenuringDistribution
這個引數用於顯示每次Minor GC時Survivor區中各個年齡段的物件的大小。
4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold
用於設定晉升到老年代的物件年齡的最小值和最大值,每個物件在堅持過一次Minor GC之後,年齡就加1。
相關文章
- 對JVM中垃圾回收機制的個人理解--新生代,老年代,永久代JVM
- JVM垃圾回收——新生代,老年代,永久代,Minor GC,Full GCJVMGC
- jvm的永久代JVM
- JVM永久代JVM
- JVM記憶體管理、JVM垃圾回收機制、新生代、老年代以及永久代JVM記憶體
- JVM 中的永久代JVM
- 輕鬆理解JVM的分代模型JVM模型
- 【深入理解JVM】方法區 永久代 元空間JVM
- JVM - 方法區(永久代)的垃圾回收JVM
- jvm的新生代和老年代簡介JVM
- 聊聊JVM的年輕代JVM
- JVM 年輕代和年老代 大小設定JVM
- 深入理解JVM虛擬機器1:JVM記憶體的結構與消失的永久代JVM虛擬機記憶體
- 關於jvm的永久代會發生垃圾垃圾回收嗎?進來便知JVM
- 80年代遊戲開發者的辛苦困境遊戲開發
- Java分代垃圾回收機制:年輕代/年老代/持久代(轉)Java
- Java永久代去哪兒了Java
- 九十年代的ERP系統(轉)
- Java 虛擬機器永久代的垃圾收集Java虛擬機
- 看動畫輕鬆理解「 堆 」動畫
- 一款80年代“GTA”遊戲的開發故事遊戲
- [Inside HotSpot] Java分代堆IDEHotSpotJava
- 深入理解JVM——(三)為什麼JVM新生代需要兩個Survivor區JVM
- 90年代Web又重新迴歸 - Max BöckWeb
- 深入理解JVM(八)——java堆分析JVMJava
- 看圖輕鬆理解最小(大)堆
- jvm垃圾分代回收演算法JVM演算法
- 淺談對標記永久化的理解
- Java面試題虛擬機器為什麼使用元空間替換了永久代(JVM篇)Java面試題虛擬機JVM
- 重回“60年代”的《魔獸世界》變得適合新人入坑了
- Jvm(27.14.2),理解升級---堆,棧,方法區JVM
- 《九十六號公路》:充滿九十年代風味的公路遊戲遊戲
- 在上世紀80年代移植一款遊戲有多難遊戲
- 蘋果iPhone歷代成本對比 初代價效比封神蘋果iPhone
- 行業動態 | Apache Pulsar 對現代資料堆疊至關重要的四個原因行業Apache
- JVM 記憶體分代、垃圾回收漫談JVM記憶體
- 貫穿90年代的“女孩遊戲運動”,讓我們學到了什麼?遊戲
- 今天的區塊鏈現狀是九十年代的網際網路?區塊鏈