
OOM問題排查:
1、top命令:查看cpu和內存的使用情況。
2、jstat命令:查看YGC和FGC情況,一般都是老年代不夠用。導致OOM
3、jmap命令: 查看哪個類的實例過多,以每個類占用多少了內存。4、jstack 查看線程與線程之間的阻塞狀態。dump文件也是通過這個命令。這是參數不一樣。
JVM調優的出發點:
1、觀察YGC的頻率和耗時
頻率過高:可能是E和S的容量不夠,2、觀察FGC的頻率和耗時
頻率過高:說明老年代的對象得不到回收。
是不是有內存泄露:Gc后老年代沒有變化
老年代的內存空間不夠大:查看每次回收后老年代的空間變化。
老年代大對象的【擔保策略】:擔保策略就是指下面4個點。備注:Java對象進入老年代的四種方式
1、minor gc之后,survivor區空間不能容量存活對象
2、對象達到年齡閾值進入老年代
3、大對象進入老年代
4、動態年齡判斷
擔保策略:4種分派方式跳轉
一、什么是TLAB
TLAB:用來解決內容分派的問題
1、指針碰撞,一半是已分派,一半是未分派,缺點:產生很多碎片。產生很多不連續的空閑空間。
2、空閑列表機制:在碰撞的基礎上,將不連續的空間,通過一個空間列表記錄起來。每次分派對象時,優先遍歷空閑列表,來
分配合適的對象。
3、高并發下,需要用到互斥鎖,這就大大折扣了,空閑列表的分派速度。為了解決內容分配效率問題,引入了TLAB的概念
4、TLAB是Thread Local Allocate buffer的縮寫,結合EMA期望算法,TLAB 是線程私有的,線程初始化的時候,會創建并初始化 TLAB缺點:TLAB 要解決的問題很明顯,盡量避免從堆上直接分配內存從而避免頻繁的鎖爭用。引入 TLAB 后,會有內
存孔隙問題,還可能影響 GC 掃描性能
總結:開發中能使用局部變量的,就不要使用在方法外定義。