最近因为滚石可乐网站的Tomcat进程每运行四五天后进程就退出,查找问题的同时也学习了JVM的相关知识。先总结如下:
首先我采用VisualVM来跟踪内存使用,线程的变化等等,现贴出几张图来直观的认识一下:
JVM内存分代示意图:
线程示意图:
根据上图显示,我想应该是线程开启后没有关闭,造成的开启线程数不断增多导致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>java -version
java version "1.6.0_05"
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) Client 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
;;
然后保存退出
这样就不抱错了。但是用它干什么就不知道了。
然后下载volano_2_9_0.class ,安装方式和volano-benchmark一样:
在startup.sh中修改JDK路径:如下图:
把java=修改为自己的jdk路径
然后运行startup.sh
我们可以通过http://192.168.0.20:8080/vcclient/index.html访问到一个页面(ip地址是运行volano的ip地址)然后点击来运行聊天室。来测试JVM性能,至于以后的东西,我就不知道怎么弄了,我刚才给Javaeye的站长发了封站内短信,期待他能回答我接下来怎么做吧。当然大家谁知道,也可以告诉兄弟。不胜感激。我也不会停止尝试。
JVM:现在流行的JVM有不少,经常见的有SUN 的HotSpot。IBM的JDK,和BEA的JRockit。等我会怎么测试了我就把他们的测试结果贴出来,给大家分享。下面我就说说Sun HotSpot的内存调优,同时说一下我对visualvm和HeapAnalyzer的应用理解
本文转自guoli0813 51CTO博客,原文链接:http://blog.51cto.com/guoli0813/301013,如需转载请自行联系原作者