JVM大體結(jié)構(gòu)圖
運(yùn)行時(shí)數(shù)據(jù)區(qū)
- 線程隔離數(shù)據(jù)區(qū)
- 程序計(jì)算器
- 當(dāng)前線程執(zhí)行字節(jié)碼的行號(hào)指示器
- 如分支、循環(huán)抄罕、跳轉(zhuǎn)、異常處理于颖、線程恢復(fù)等
- 虛擬機(jī)棧
- 棧幀存儲(chǔ)區(qū)域呆贿,棧幀包含局部變量、操作數(shù)棧森渐、動(dòng)態(tài)鏈接做入、方法出口等
- 異常情況,StackOverflowError同衣、OutOfMemoryError
- 本地方法棧
- JNI服務(wù)使用的棧竟块,作用于本地方法(C/C++)
- 程序計(jì)算器
- 線程共享數(shù)據(jù)區(qū)
- Java堆
- 存儲(chǔ)對(duì)象實(shí)例
- 異常情況, OutOfMemoryError耐齐、內(nèi)存泄漏
- 方法區(qū)
- 存儲(chǔ)加載的類信息彩郊、常量、靜態(tài)變量蚪缀、JIT編譯后的代碼等數(shù)據(jù)
- 異常情況,OutOfMemoryError
- 運(yùn)行時(shí)常量池恕出,字面量询枚、符號(hào)引用
- Java堆
對(duì)象創(chuàng)建與回收過(guò)程
JVM垃圾收集算法
復(fù)制
- 內(nèi)存分成大小相等的兩塊,每次使用其中一塊浙巫,回收的時(shí)候金蜀,把存活的對(duì)象復(fù)制到另一塊刷后,然后把這塊內(nèi)存整個(gè)清理掉
- 優(yōu)點(diǎn),回收效率提高渊抄、不存在碎片化
- 缺點(diǎn)尝胆,內(nèi)存利用率低
- 解決,采用非對(duì)稱法护桦,eden:survivor = 8:1
標(biāo)記清除
- 標(biāo)記階段含衔,確定所有要回收的對(duì)象,做標(biāo)記
- 清除階段二庵,將標(biāo)記階段確定的回收對(duì)象進(jìn)行清除
- 優(yōu)點(diǎn)贪染,簡(jiǎn)單,最基礎(chǔ)算法
-
缺點(diǎn)催享,效率低杭隙,碎片化
標(biāo)記整理
- 把存活對(duì)象移動(dòng)到內(nèi)存的一端,然后直接回收邊界以外的內(nèi)存
- 場(chǎng)景,適合老年代存活對(duì)象較多的情況因妙,減少內(nèi)存復(fù)制量
垃圾收集器
Serial/SerialOld
- 過(guò)程
- 收集GC_ROOTS
- 對(duì)象可達(dá)性分析
- 標(biāo)記垃圾對(duì)象
- 清理垃圾對(duì)象
- 優(yōu)點(diǎn)痰憎,簡(jiǎn)單高效
- 缺點(diǎn),STW攀涵,服務(wù)停頓時(shí)間長(zhǎng)
-
場(chǎng)景铣耘,幾百兆以內(nèi)客戶端程序
Parnew/Parallel Scavenge/Parallel Old
Serial算法多線程版
- 優(yōu)點(diǎn),多線程汁果,回收速度快
- 缺點(diǎn)涡拘,依然會(huì)暫停服務(wù)
- 場(chǎng)景,對(duì)響應(yīng)時(shí)間要求不高的Server端
ParNew與Parallel Scanvenge區(qū)別
- Parnew關(guān)注回收速度据德,多線程減少單詞GC時(shí)間
-
Parallel Scanvenge關(guān)注吞吐量鳄乏,減少GC時(shí)間占比
CMS(Concurrent Mark Sweep)算法
- 優(yōu)點(diǎn),并發(fā)棘利,暫停時(shí)間短
- 缺點(diǎn)橱野,耗CPU、GC時(shí)間長(zhǎng)善玫,GC提前水援,浮動(dòng)垃圾,碎片化
-
場(chǎng)景茅郎,對(duì)響應(yīng)時(shí)間敏感的Server服務(wù)蜗元,大部分線上服務(wù)應(yīng)該是CMS
G1垃圾回收器
- 新一代垃圾回收算法
-
場(chǎng)景,大內(nèi)存系冗、高響應(yīng)的服務(wù)端應(yīng)用
JVM工具集
JPS
- 查看當(dāng)前用戶java進(jìn)程奕扣,類似于ps
- -q 只輸出LVMID(與PID一致),省略主類的名稱
- -m 輸出啟動(dòng)時(shí)傳遞給主類main函數(shù)的參數(shù)
- -l 輸出主類的全名掌敬,如果是jar包惯豆,輸出jar路徑
- -v 輸出啟動(dòng)時(shí)的jvm參數(shù)
jstack
- 用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息池磁,例如類裝載、內(nèi)存楷兽、垃圾收集地熄、 jit編譯等運(yùn)行參數(shù)
- -class 監(jiān)視類裝載、卸載數(shù)量芯杀、總空間以及裝載所耗費(fèi)時(shí)間等
- -gc 監(jiān)視java堆狀況端考,包括eden區(qū),survivor區(qū)瘪匿,老年代跛梗,永久代的容量、已用 空間和 GC時(shí)間等信息
- -gcnew 監(jiān)視新生代GC狀況
- -gcold 監(jiān)視老年代GC狀況
- -compiler 輸出JIT編譯器編譯過(guò)的方法棋弥、耗時(shí)等信息
jmap
- java內(nèi)存映像工具核偿,用于生成堆轉(zhuǎn)儲(chǔ)快照,即dump文件顽染,結(jié)合JHAT漾岳、MAT或者VisualVM等軟件 來(lái)分析java內(nèi)存的詳細(xì)使用情況,便于排查java內(nèi)存問(wèn)題
- -dump 生成堆轉(zhuǎn)儲(chǔ)快照
- -finalizerinfo 顯示在等待執(zhí)行finalize方法的對(duì)象
- -heap 顯示java堆詳細(xì)信息粉寞,如使用的回收器尼荆、參數(shù)配置、分代狀況等
- -histo 顯示堆中對(duì)象統(tǒng)計(jì)信息唧垦,包括類捅儒、實(shí)例數(shù)量、合計(jì)容量等
- -permstat 以classloader為統(tǒng)計(jì)口徑顯示永久代內(nèi)存狀態(tài)
- -F 強(qiáng)制生成堆轉(zhuǎn)出快照