后續(xù)如果在出現(xiàn)java.lang.OutOfMemoryError: unable to create new native thread
可以通過以下步驟進(jìn)行處理(pid都是代表的出問題的線程ID):
jmap -heap pid 獲取當(dāng)前現(xiàn)成的jmap堆信息,對比第四步中的剩余RAM
jstack -l pid > 1.txt 將當(dāng)前線程堆棧信息輸出到文本1.txt祟绊,拷貝出來
ulimit -u/-a 查看系統(tǒng)當(dāng)前用戶最大連接數(shù),如果不夠齿梁,調(diào)整
free -m 查看當(dāng)前系統(tǒng)的剩余總量,因?yàn)閖vm的線程系統(tǒng)調(diào)用都是通過系統(tǒng)內(nèi)核調(diào)用的浓恳,需要查看當(dāng)前RAM的剩余空間是否足夠支持繼續(xù)創(chuàng)建線程
cat /proc/loadavg 第四個參數(shù)同仆,第一位表示目前活動的cpu(小于或等于cpu數(shù)量),第二位表示后續(xù)等待執(zhí)行的線程
ps -elfT | wc -l 查看當(dāng)前服務(wù)器的所有線程數(shù)
ps -p pid -lfT | wc -l 查看當(dāng)前PID的所有線程數(shù)
java -XX:+PrintFlagsFinal -version | grep ThreadStackSize 查看當(dāng)前jvm中每個新建的線程需要占據(jù)多少內(nèi)存兼贸,jdk8默認(rèn)一個線程1M齿税,如果此值過大彼硫,可以啟動的時候通過jvm參數(shù) -Xss128K 指定大小,或者新增機(jī)器內(nèi)存
需要打印異常后的dump文件凌箕,所以jar包啟動方式如下:java -Xms1024m -Xmx2014m -Xmn512m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump/dump.hprof dump.HeapOOM
對應(yīng)含義
-Xms:堆初始大小
-Xmx:堆最大值
-Xmn:新生代大信±骸(老年代大小=堆大小-新生代大小)
-XX:+HeapDumpOnOutOfMemoryError:發(fā)生內(nèi)存溢出時生成heapdump文件
-XX:HeapDumpPath:指定heapdump文件
生產(chǎn)情況牵舱,優(yōu)先執(zhí)行第二步驟串绩,需要dump文件分析當(dāng)前的線程情況,其余的可以按優(yōu)先級執(zhí)行134678
如何分析定位cpu飆高的相關(guān)步驟:
- top 找出cpu占比最高的pid
- ps -mp pid -o THREAD,tid,time 打印出當(dāng)前pid中占用最大的線程號
- printf "%x\n" tid 轉(zhuǎn)換為16進(jìn)制
- jstack pid | grep tid -A 30 在對應(yīng)的jstack日志中查找對應(yīng)的堆棧詳細(xì)信息芜壁,根據(jù)實(shí)際情況定位處理