天天看點

記一次記憶體溢出java.lang.OutOfMemoryError: unable to creatpstree -p 程序号top -Hp 程序号pstree -p ps -e | grep server | awk '{print $1}' pstree -p ps -e | grep server | awk '{print $1}' | wc -l

1、事發

剛好在外幹活,開發着急上線,就遠端進行上線,過程中發現tomcat出現大量異常日志。

2、報錯日志

java.lang.OutOfMemoryError: unable to create new native thread

3、原因:得知市場部門正在推廣app

4、直接去看接口并發以及資料庫監控,發現接口并發連接配接數峰值在2500左右,全站應用日志都在報錯,就猜到了又是資料庫出現了瓶頸,結果發現是一台從庫cpu100%導緻所有查詢都吭住了。明明兩台從庫可是請求大多數都在了第二台從庫上,告知市場部情況并要求暫時停止推廣,開發修改代碼将部分應用手工指定連接配接到第一台從庫上,問題得到解決。

最開始以為是并發過大導緻的應用記憶體溢出,就做了一些關于程序的線程數量查詢,以下是記錄:

pstree -p <code>ps -ef | grep story-wap|grep -v grep | awk '{print $2}'</code> | wc -l

檢視story-wap程序的線程數量(如果story-wap過濾不出來會統計系統所有的線程數量)

pstree -p <code>ps -ef | grep story-app|grep -v grep | awk '{print $2}'</code> | wc -l

pstree -p <code>ps -ef | grep story-back|grep -v grep | awk '{print $2}'</code> | wc -l

Linux下檢視某個程序的線程數量

有些時候需要确實程序内部目前運作着多少線程,那麼以下幾個方法值得一用。

1.根據程序号進行查詢:

2.根據程序名字進行查詢:

這裡利用了管道和指令替換,

關于指令替換,我也是今天才了解,就是說用<code>括起來的指令會優先執行,然後以其輸出作為其他指令的參數,&lt;br/&gt;上述就是用 ps -e | grep server | awk '{print $1}' 的輸出(程序号),作為 pstree -p 的參數&lt;br/&gt;管道和指令替換的差別是:&lt;br/&gt;管道:管道符号"|"左邊指令的輸出作為右邊指令的輸入&lt;br/&gt;指令替換:将指令替換符"</code>"中指令的輸出作為其他指令相應位置的參數

參考

<a href="http://www.cnblogs.com/myshare/p/5177135.html">http://www.cnblogs.com/myshare/p/5177135.html</a>

kill -9 <code>ps -ef |grep story-app|grep -v grep|awk '{print $2}'</code>

kill -9 <code>ps -ef |grep story-back|grep -v grep|awk '{print $2}'</code>

kill -9 <code>ps -ef |grep story-wap|grep -v grep|awk '{print $2}'</code>

本文轉自 天樂 51CTO部落格,原文連結:http://blog.51cto.com/tianlegg/2054112,如需轉載請自行聯系原作者