我正在运行一个Web应用程序,使用目前最新版本的JDK 1.6.0.18和Tomcat 6.0.24,在RHEL 5.2(Tikanga)上进行压力测试(30个线程每天访问600万次页面),但在4小时到8天后意外崩溃。崩溃报告在http://pastebin.com/f639a6cf1,其中一致的部分是:
- 抛出了SIGSEGV异常
- 发生在libjvm.so上
- eden空间总是满的(100%)
JVM使用以下选项运行:
CATALINA_OPTS="-server -Xms512m -Xmx1024m -Djava.awt.headless=true"
我还使用了http://memtest.org/测试硬件内存是否存在问题,连续运行了48小时(整个内存的14次通过),没有发现任何错误。
我启用了-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
以检查是否存在GC趋势或空间不足,但没有发现任何可疑的情况。GC和full GC会在可预测的间隔时间内发生,几乎总是释放相同数量的内存容量。
我的应用程序没有直接使用任何本地代码。
您有任何想要建议我接下来该去哪里寻找问题的想法吗?
编辑-更多信息:
1)这个JDK中没有客户端vm:
[foo@localhost ~]$ java -version -server
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
[foo@localhost ~]$ java -version -client
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
2) 更改操作系统不可行。
3) 我不想更改JMeter压力测试变量,因为这可能会隐藏问题。由于我有一个使用案例(当前的压力测试场景)会导致JVM崩溃,所以我想修复崩溃而不是更改测试。
4) 我已经对我的应用程序进行了静态分析,但没有发现任何严重问题。
5) 内存不会随时间增长。内存使用在启动后非常快速地平衡,并且保持着稳定的趋势,看起来并不可疑。
6) /var/log/messages 在崩溃之前或期间没有包含任何有用的信息。
更多信息:我忘记提到,有一个Apache(2.2.14)前置Tomcat,使用 mod_jk 1.2.28。现在我正在不使用Apache的情况下运行测试,以防JVM崩溃与连接到JVM(Tomcat连接器)的mod_jk本机代码有关。
之后(如果JVM再次崩溃),我将尝试从我的应用程序中删除一些组件(缓存、lucene、quartz),然后尝试使用Jetty。由于崩溃当前发生的时间在4小时到8天之间,可能需要很长时间才能找出问题所在。