聊聊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的分代模型JVM模型
- 對jvm堆中年輕代,老年代,永久代的理解JVM
- 聊聊jvm的Code CacheJVM
- 聊聊jvm的CompressedClassSpaceJVM
- jvm的永久代JVM
- 聊聊jvm的PermGen與MetaspaceJVM
- Java分代垃圾回收機制:年輕代/年老代/持久代(轉)Java
- JVM 中的永久代JVM
- 聊聊jvm的StringTable及SymbolTableJVMSymbol
- JVM永久代JVM
- 聊聊JVM的垃圾回收機制GCJVMGC
- 益普索Ipsos :疫情下的年輕一代
- JVM - 方法區(永久代)的垃圾回收JVM
- 聊聊我對現代前端框架的認知前端框架
- JVM記憶體管理、JVM垃圾回收機制、新生代、老年代以及永久代JVM記憶體
- 從電競練習生到B站UP主,年輕一代的AI生活AI
- jvm的新生代和老年代簡介JVM
- 聊聊那些年的騷操作!!!
- jvm垃圾分代回收演算法JVM演算法
- 對JVM中垃圾回收機制的個人理解--新生代,老年代,永久代JVM
- 瞭解Java物件,簡單聊聊JVM調優分析Java物件JVM
- JVM垃圾回收——新生代,老年代,永久代,Minor GC,Full GCJVMGC
- 美國男性危機:色情視訊遊戲將毀掉年輕一代遊戲
- 深入理解JVM虛擬機器1:JVM記憶體的結構與消失的永久代JVM虛擬機記憶體
- JVM 記憶體分代、垃圾回收漫談JVM記憶體
- Ipsos:調查顯示現代年輕女性更加容易產生性幻想
- 聊聊那些年遇到過的奇葩程式碼
- 【深入理解JVM】方法區 永久代 元空間JVM
- 深入理解JVM——(三)為什麼JVM新生代需要兩個Survivor區JVM
- 年輕開發者的那些傷心事
- JVM調優總結-分代垃圾回收詳述1JVM
- JVM調優總結-分代垃圾回收詳述2JVM
- Java虛擬機器:JVM記憶體分代策略Java虛擬機JVM記憶體
- 2018年的Docker和JVMDockerJVM
- 舉一個有趣的例子,讓你輕鬆搞懂JVM記憶體管理JVM記憶體
- 關於jvm的永久代會發生垃圾垃圾回收嗎?進來便知JVM
- JVM調優總結(九)-新一代的垃圾回收演算法JVM演算法