天天看點

JVM學習筆記

最近因為滾石可樂網站的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&amp;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,如需轉載請自行聯系原作者