JVM記憶體結構知識點整理
- jvm 記憶體配置設定
-
- 記憶體配置設定
- GC
jvm 記憶體配置設定
記憶體配置設定
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9cmTx0kaNhXWU1EM4wmYwhGWhxGZzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnBnauYjNyIjNwcTMwMjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
JVM記憶體配置設定過程
1、JVM 會試圖為相關Java對象在Eden中初始化一塊記憶體區域。
2、當Eden空間足夠時,記憶體申請結束;否則到下一步。
3、JVM 試圖釋放在Eden中所有不活躍的對象(這屬于1或更進階的垃圾回收)。釋放後若Eden空間仍然不足以放入新對象,則試圖将部分Eden中活躍對象放入Survivor區。
4、Survivor區被用來作為Eden及Old的中間交換區域,當Old區空間足夠時,Survivor區的對象會被移到Old區,否則會被保留在Survivor區。
5、當Old區空間不夠時,JVM 會在Old區進行完全的垃圾收集(0級)。
6、完全垃圾收集後,若Survivor及Old區仍然無法存放從Eden複制過來的部分對象,導緻JVM無法在Eden區為新對象建立記憶體區域,則出現”out of memory”錯誤。
jvm晉升機制
1、長期存活的對象
虛拟機對每個對象定義了一個對象年齡(Age)計數器。當年齡增加到一定的臨界值時,就會晉升到老年代中,該臨界值由參數:-XX:MaxTenuringThreshold來設定。
如果對象在Eden出生并在第一次發生MinorGC時仍然存活,并且能夠被Survivor中所容納的話,則該對象會被移動到Survivor中,并且設Age=1;以後每經曆一次Minor GC,該對象還存活的話Age=Age+1。
2、大對象直接進入老年代
3、minor gc後,survivor仍然放不下
4、動态年齡判斷 ,大于等于某個年齡(此年齡的所有對象之和超過了survivor空間一半)的 對象直接進入老年代
GC
分代gc的原因:
不同的對象的生命周期是不一樣的。是以,不同生命周期的對象可以采取不同的收集方式,以便提高回收效率。年輕代對象生命周期較短,年輕代區間也較小需要頻繁回收,老年代的對象生命周期較長,不需要頻繁回收
新生代gc和老年代gc
Minor GC:新生代GC,指發生在新生代的垃圾收集動作,所有的Minor GC都會觸發全世界的暫停(stop-the-world),停止應用程式的線程,不過這個過程非常短暫。-------采用複制壓縮算法GC
Major GC/Full GC:老年代GC,指發生在老年代的GC。整個老年代所有記憶體進行GC,整體使用标記整理算法,所謂整理就是壓縮,剩下的不清除的資源進行一次移動,壓縮移動到一起。也有的直接标記清除
Eden區滿了觸發Minor GC,這時會把Eden區存活的對象複制到Survivor區,當對象在Survivor區熬過一定次數的Minor GC之後,就會晉升到老年代(當然并不是所有的對象都是這樣晉升的到老年代的),當老年代滿了,就會報OutofMemory異常。
判斷是否要回收
引用計數算法(互相引用有問題)主流jvm已不使用
可達性算法
GC收集器
新生代
serial gc,單線程收集器,适用于小的應用。
parallel Scavenge gc 高吞吐量(吞吐量高,jvm效率更高,适合不響應jvm自身處理多的應用)的并發gc收集器
(使用parallel時可以設定吞吐量參數:用于精确控制吞吐量
-XX:MaxGCPauseMillis 最大垃圾收集停頓時間
-XX:GCTimeRatio 垃圾收集時間與運作使用者代碼時間的比例=垃圾收集時間/運作使用者代碼時間,相當于是吞吐量的倒數。
實作:降低GC停頓時間:犧牲吞吐量和新生代空間(減小新生代空間,GC頻率變大,吞吐量降低)
GC自适應的調節政策
-XX:+UseAdaptiveSizePolicy 使用自适應的調節政策 即不需要指定新生代的大小,Eden與Surivior的比例,晉升老年代的年齡等細節參數,虛拟機自動根據根據目前系統的狀态動态調整這些參數以提供最合适的停頓時間或最大的吞吐量。)
parnew gc 低停頓時間(停頓時間少,jvm響應率高,适合多響應的應用)并發gc收集,主要配合cms使用
老年代
serial old 同新生代
parallel old 同新生代
cms
收集過程
1).初始标記:暫停使用者線程,标記GC Roots能直接關聯的對象,速度很快
2).并發标記:使用者線程與标記線程并發,進行GC Roots Tracing的過程
3).重新标記:為了修正并發标記期間,因使用者程式繼續運作而導緻标記産生變動的那一部分對象的标記記錄,這個階段的停頓時間一般會比初始标記階段稍長一些,但遠比并發标記的時間短。
4).并發清除:使用者線程與清除線程并發。
把原先的标記分為三次,由于标記常要停頓,不然不準确,是以優化标記,第二次并發标記不觸發停頓,造成錯誤第三次修改。是以cms是一個低停頓時間的收集器。
G1回收器
CMS收集器和G1收集器的差別
差別一: 使用範圍不一樣 g1可使用老年代和新生代,而cms使用在老年代并且得配合其他收集器一起使用
差別二: STW的時間 CMS收集器以最小的停頓時間為目标的收集器、G1收集器可預測垃圾回收的停頓時間(建立可預測的停頓時間模型)
差別三: 垃圾碎片
CMS收集器是使用“标記-清除”算法進行的垃圾回收,容易産生記憶體碎片
G1收集器使用的是“标記-整理”算法,進行了空間整合,降低了記憶體空間碎片。
差別四: 垃圾回收的過程不一樣
CMS收集器 G1收集器
- 初始标記 1.初始标記
- 并發标記 2. 并發标記
- 重新标記 3. 最終标記
-
并發清楚 4. 篩選回收
差別五:
g1對整個堆進行了劃分,劃分了很多小塊空間,對小塊空間進行收集,cms對整個對進行收集