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