最近因為滾石可樂網站的Tomcat程序每運作四五天後程序就退出,查找問題的同時也學習了JVM的相關知識。先總結如下:
首先我采用VisualVM來跟蹤記憶體使用,線程的變化等等,現貼出幾張圖來直覺的認識一下:
JVM記憶體分代示意圖:
<a href="http://guoli0813.blog.51cto.com/attachment/201004/19/623863_1271682304eC6h.gif"></a>
線程示意圖:
<a href="http://guoli0813.blog.51cto.com/attachment/201004/19/623863_1271682307IUg5.gif"></a>
根據上圖顯示,我想應該是線程開啟後沒有關閉,造成的開啟線程數不斷增多導緻native記憶體不夠,進而報這樣的錯誤。
2010-4-16 9:55:28 org.apache.tomcat.util.net.AprEndpoint$Acceptor run
嚴重: Socket accept failed
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at org.apache.tomcat.util.net.AprEndpoint$Worker.start(AprEndpoint.java:1307)
at org.apache.tomcat.util.net.AprEndpoint.newWorkerThread(AprEndpoint.java:914)
at org.apache.tomcat.util.net.AprEndpoint.createWorkerThread(AprEndpoint.java:893)
at org.apache.tomcat.util.net.AprEndpoint.getWorkerThread(AprEndpoint.java:925)
at org.apache.tomcat.util.net.AprEndpoint$Acceptor.run(AprEndpoint.java:1005)
at java.lang.Thread.run(Thread.java:619)
我說一下我的生産機的環境:
OS:windows2003 32位企業版
JVM:
C:\Documents and Settings\actop&gt;java -version
java version "1.6.0_05"
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM)<b> Client </b>VM (build 10.0-b19, mixed mode, sharing)
Tomcat版本:tomcat-5.5.23
catalina.bat裡面的設定:
set JAVA_OPTS=-server -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -Xms1400m -Xmx1400m -XX:NewSize=48m -XX:MaxNewSize=128m -XX:PermSize=128m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true
set CATALINA_OPTS=%CATALINA_OPTS% -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true
這個問題我們開發組查程式,然後把這個bug解決掉而收場,在查找問題的過程中,學習了大量的知識,總結一下。
首先介紹一款JVM測試工具VOLANO Benchmark(http://www.volano.com/benchmarks.html),下面我将在CentOS5.4下進行軟體的安裝,首先下載下傳程式:
[root@hadoop5 ~]# wget -c http://www.volano.com/files/volano_benchmark_2_9_0.class
然後進入GUI界面,安裝此程式:(不進入GUI界面安裝方式:java volano-benchmark-2.9.0 -o /usr/local/volano-benchmark/)
[root@hadoop5 ~]# java volano-benchmark-2.9.0
然後程式啟動自己的圖形界面進行安裝,我們下一步下一步就會安裝完畢。我們進入volano-benchmark-2.9.0目錄修改startup.sh
[root@hadoop5 ~]#vi startup.sh 輸入 :set nu來顯示行号
第86行: ulimit –Sn 10240 àulimit –Hn 10240,
複制從98行到106行,修改成你的jdk路徑,參數自己設定,比如我就添加了下面這一段:
sunjdk)
java=/usr/local/jdk1.6.0_19/bin/java
if [ "$1" = "loop" ]
then
options="-server -Xmx64m"
else
options="-server -Xmx256m -Xss128k"
fi
;;
然後儲存退出
<a href="http://guoli0813.blog.51cto.com/attachment/201004/19/623863_1271682310mTkm.jpg"></a>
這樣就不抱錯了。但是用它幹什麼就不知道了。
然後下載下傳volano_2_9_0.class ,安裝方式和volano-benchmark一樣:
<a href="http://guoli0813.blog.51cto.com/attachment/201004/19/623863_1271682311DLgG.jpg"></a>
在startup.sh中修改JDK路徑:如下圖:
<a href="http://guoli0813.blog.51cto.com/attachment/201004/19/623863_1271682313loxa.jpg"></a>
把java=修改為自己的jdk路徑
然後運作startup.sh
<a href="http://guoli0813.blog.51cto.com/attachment/201004/19/623863_1271682314jTZu.jpg"></a>
JVM:現在流行的JVM有不少,經常見的有SUN 的HotSpot。IBM的JDK,和BEA的JRockit。等我會怎麼測試了我就把他們的測試結果貼出來,給大家分享。下面我就說說Sun HotSpot的記憶體調優,同時說一下我對visualvm和HeapAnalyzer的應用了解
本文轉自guoli0813 51CTO部落格,原文連結:http://blog.51cto.com/guoli0813/301013,如需轉載請自行聯系原作者