作者:馬士兵教育 http://mashibing.com
GC的基礎(chǔ)知識
1.什么是垃圾
C語言申請內(nèi)存:malloc free
C++: new delete
Java: new ?自動內(nèi)存回收,編程上簡單,系統(tǒng)不容易出錯,手動釋放內(nèi)存,容易出兩種類型的問題:
- 忘記回收
- 多次回收
沒有任何引用指向的一個對象或者多個對象(循環(huán)引用)
2.如何定位垃圾
- 引用計數(shù)
- 根可達(dá)算法
3.常見的垃圾回收算法
- 標(biāo)記清除 - 位置不連續(xù) 產(chǎn)生碎片
- 拷貝算法 - 沒有碎片,浪費(fèi)空間
- 標(biāo)記壓縮 - 沒有碎片,效率偏低
4.JVM內(nèi)存分代模型(用于分代垃圾回收算法)
- 部分垃圾回收器使用的模型
- 新生代 + 老年代 + 永久代(1.7)/ 元數(shù)據(jù)區(qū)(1.8) Metaspace
- 永久代 元數(shù)據(jù) - Class
- 永久代必須指定大小限制 ,元數(shù)據(jù)可以設(shè)置,也可以不設(shè)置,無上限(受限于物理內(nèi)存)
- 字符串常量 1.7 - 永久代,1.8 - 堆
- MethodArea邏輯概念 - 永久代、元數(shù)據(jù)
- 新生代 = Eden + 2個suvivor區(qū)
- YGC回收之后,大多數(shù)的對象會被回收,活著的進(jìn)入s0
- 再次YGC,活著的對象eden + s0 -> s1
- 再次YGC,eden + s1 -> s0
- 年齡足夠 -> 老年代 (15 CMS 6)
- s區(qū)裝不下 -> 老年代
- 老年代
- 頑固分子
- 老年代滿了FGC Full GC
- GC Tuning (Generation)
- 盡量減少FGC
- MinorGC = YGC
- MajorGC = FGC
5.常見的垃圾回收器
- Serial 年輕代 串行回收
- PS 年輕代 并行回收
- ParNew 年輕代 配合CMS的并行回收
- SerialOld
- ParallelOld
- ConcurrentMarkSweep 老年代 并發(fā)的, 垃圾回收和應(yīng)用程序同時運(yùn)行,降低STW的時間(200ms)
- G1(10ms)
- ZGC (1ms) PK C++
- Shenandoah
- Eplison
1.8默認(rèn)的垃圾回收:PS + ParallelOld
6.JVM調(diào)優(yōu)第一步,了解生產(chǎn)環(huán)境下的垃圾回收器組合
JVM的命令行參數(shù)參考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
-
JVM參數(shù)分類
標(biāo)準(zhǔn): - 開頭,所有的HotSpot都支持
非標(biāo)準(zhǔn):-X 開頭,特定版本HotSpot支持特定命令
不穩(wěn)定:-XX 開頭,下個版本可能取消
-XX:+PrintCommandLineFlags
-XX:+PrintFlagsFinal 最終參數(shù)值
-XX:+PrintFlagsInitial 默認(rèn)參數(shù)值