linux下Java内存溢出排查
1、查詢gc情況(每1秒鐘打印一次gc情況)
jstat -gcutil pid 1000:1查詢結果含義:
S0:幸存區1占用率
S1:幸存區2占用率
E:Eden區占用率
O:老年區占用率
M:元數據區(java8,相當于java7及之前的永久代的概念)使用大小
ccs:壓縮后使用率
YGC:young gc 次數,
YGCT:young gc耗時
FGC:full gc次數
FGCT:full gc耗時
GCt:GC共耗時
2、查詢進程信息
#查詢占用內存的進程(shift+m排序) top #存活的對象占用內存前100排序 jmap -histo:live 41843 | head -n 1003、查詢進程里面詳細信息
jmap -heap 41843如果Jave類的內存異常則檢查代碼
如果發現頻繁的gc是因為新生代、老年代、永久代分配的大小有問題,則可以通過修改設置解決
eg:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:PermSize=64M -XX:MaxPermSize=128M -XX:MaxTenuringThreshold=0參數含義:
- -Xmx3550m 堆最大容量(heap max size)
- -Xms3550m 堆最小容量(heap min size)
- -Xmn2g 年輕代大小
- -Xss256k 每個線程棧容量大小(stack size)
- -XX:NewRatio=4 年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代),設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5;
- -XX:SurvivorRatio=4 年輕代中Eden區與Survivor區的大小比值,設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6
- -XX:PermSize=64M 初始分配的永生代容量
- -XX:MaxPermSize=128M 永生代最大容量
- -XX:MaxTenuringThreshold=0 設置垃圾最大年齡
-Xmn對系統性能影響較大,Sun官方推薦配置為整個堆的3/8;JVM內存大小=年輕代大小 + 年老代大小 + 持久代大小持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。
JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右;
-XX:MaxTenuringThreshold如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代。對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
總結
以上是生活随笔為你收集整理的linux下Java内存溢出排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用excel批量创建文件夹?
- 下一篇: 以太网/FX3U/PLC/工控板/PLC