上一篇 <<<JVM元空間(方法區(qū))和棧內(nèi)存溢出原因及解決方案
下一篇 >>>JVM常見死鎖問題產(chǎn)生原因和多種診斷方式
1.錯誤現(xiàn)象
泄露:java.lang.OutOfMemoryError: GC overhead limit exceeded
溢出:java.lang.OutOfMemoryError: Java heap space
2.內(nèi)存溢出和內(nèi)存泄露區(qū)別
內(nèi)存溢出:是在申請內(nèi)存空間時,超出最大堆內(nèi)存空間物邑,系統(tǒng)給不了
內(nèi)存泄露:使用過的內(nèi)存沒有及時清理猴凹,長時間占用內(nèi)存扔亥,最終導(dǎo)致內(nèi)存耗盡溢出帆竹『技澹【靜態(tài)常量太多哼拔、IO流等不關(guān)閉都會導(dǎo)致】
3.如何判斷
jstat命令可查看堆的使用情況及垃圾回收情況概行。
用法:jstat –gcutil pid
S0 S1 E 為新生代
O為老年代
M是元區(qū)間(方法區(qū))
YGC新生代執(zhí)行次數(shù)
YGCT新生代執(zhí)行時間
FGC老年代執(zhí)行次數(shù)
FGCT老年代執(zhí)行時間
GCT總垃圾回收時間(單位秒)
3.1內(nèi)存溢出
a.jstat效果
代碼中有大對象被引用盖呼,內(nèi)存溢出后會立馬被回收掉儒鹿,不會影響其他接口
b.代碼演示
@GetMapping("/oom")
public String cms() {
List<byte[]> bytes = new ArrayList<>();
while (true) {
byte[] bytes1 = new byte[1024 * 1024 * 4];
bytes.add(bytes1);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3.2內(nèi)存泄露
a.jstat效果
程序中有大對象,GC沒辦法回收几晤,所以E和O特別高挺身,會影響到代碼的其他接口
b.代碼演示
private List<byte[]> bytes = new ArrayList<>();
@GetMapping("/memoryLeak")
public String oom() {
while (true) {
byte[] bytes1 = new byte[1024 * 1024 * 4];
bytes.add(bytes1);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4.如何定位問題點
4.1 內(nèi)存快照打印
方式一:啟動腳本增加配置
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/jarye/Downloads/heapdump.dump
方式二:jmap命令
jmap -dump:format=b,file=#輸出dump地址 pid
例如:jmap -dump:format=b,file=/Users/jarye/Downloads/a.dump 8625
tips:生產(chǎn)服務(wù)器千萬不要打,每次打的時候锌仅,所有的程序都會停止掉章钾,而且差不多是有物理內(nèi)存的1/5大小,16G的會產(chǎn)生3G左右的快照热芹。
4.2 內(nèi)存快照文件導(dǎo)入jdk自帶的jvisualvm工具贱傀,即可看到錯誤
內(nèi)存溢出
內(nèi)存泄露
4.3 內(nèi)存快照文件導(dǎo)入JProfile工具,比jvisualvm排查更直觀伊脓。
5.解決方案
合理調(diào)整堆的初始值府寒、最大值、以及堆中的新生代报腔、老年代比例等株搔。詳情見:JVM性能調(diào)優(yōu)的評估指標(biāo)及調(diào)優(yōu)示例
a、內(nèi)存溢出:加內(nèi)存
b纯蛾、內(nèi)存泄露:加內(nèi)存纤房、減少變量的使用范圍以達到盡快釋放回收
相關(guān)文章鏈接:
<<<JVM整體內(nèi)存結(jié)構(gòu)的圖解,直觀明了
<<<javap命令查看對象信息及操作方法在JVM層的實現(xiàn)原理
<<<javap命令反查匯編指令匯總
<<<ClassLoader類加載器順序Demo測試與雙親委派源碼解讀
<<<自定義SPI和熱部署技術(shù)破壞類加載器的雙親委派模式
<<<JVM中對象如何完成空間分配和初始化工作
<<<JVM元空間(方法區(qū))和棧內(nèi)存溢出原因及解決方案
<<<JVM常見死鎖問題產(chǎn)生原因和多種診斷方式
<<<服務(wù)器CPU飆升為100%問題排查及如何避免
<<<JVM內(nèi)存診斷命令和排查工具匯總
<<<JVM新生代老年代算法匯總圖解
<<<JVM垃圾回收不要手動System.gc的真正原因
<<<JVM垃圾回收引用計數(shù)法和根搜索算法圖解
<<<JVM垃圾回收STW(Stop-The-World)代碼演示
<<<JVM垃圾回收器的發(fā)展歷程及使用場景匯總
<<<JVM串行并行垃圾回收器的關(guān)注點
<<<一張圖看懂CMS垃圾回收器的底層原理
<<<G1能作為JDK9默認(rèn)垃圾回收器的優(yōu)勢分析
<<<CMS和G1的漏標(biāo)問題解決及三色標(biāo)記算法圖解
<<<GC中新生代進入老年代的方式匯總
<<<GC常用日志參數(shù)配置及分析工具說明
<<<FullGC翻诉、MinorGC炮姨、STW等常見問題如何解答
<<<JVM性能調(diào)優(yōu)的評估指標(biāo)及調(diào)優(yōu)示例