【发布时间】:2011-01-15 21:10:42
【问题描述】:
在 4 到 24 小时 4 小时到 8 天后,在(当前最新的)tomcat 6.0.24 上运行 Web 应用程序时,我遇到了(当前最新的)jdk 1.6.0.18 崩溃压力测试(30 个线程以 600 万次/天的浏览量访问应用程序)。这是在 RHEL 5.2 (Tikanga) 上。
崩溃报告位于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 和完全 GC 以可预测的时间间隔发生,几乎总是释放相同数量的内存容量。
我的应用程序不直接使用任何本机代码。
对我接下来应该看哪里有什么想法吗?
编辑 - 更多信息:
1) 这个JDK中没有客户端虚拟机:
[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) 我在申请中完成了static analysis,但没有出现任何严重问题。
5) 内存不会随时间增长。内存使用量以非常稳定的趋势非常迅速地平衡(启动后),这似乎并不可疑。
6) /var/log/messages 在崩溃之前或期间不包含任何有用的信息
更多信息:忘了提到有一个使用 mod_jk 1.2.28 的 apache (2.2.14) 前端 tomcat。现在我在没有 apache 的情况下运行测试,以防 JVM 崩溃与连接到 JVM(tomcat 连接器)的 mod_jk 本机代码有关。
之后(如果 JVM 再次崩溃)我将尝试从我的应用程序中删除一些组件(缓存、lucene、quartz),稍后将尝试使用码头。由于崩溃目前在 4 小时到 8 天之间的任何时间发生,因此可能需要很长时间才能查明发生了什么。
【问题讨论】:
-
这个需要去
SunOracle。 -
@bmargulies:这就是我最初的想法,但后来我读到了stackoverflow.com/questions/1353514/…
-
假设您使用的是最新的 JDK,您是否尝试过使用 VisualVM 实时研究其行为?我们发现它在调查泄漏方面比第三方配置文件更有效。
-
@Uri:感谢您提到 VisualVM。看起来很有趣。
-
没有问题。我们对此非常满意,尤其是与我们之前使用过的工具相比。唯一需要花费时间的是加载堆转储。但是您可以让分析器配置内存而不是性能,它实际上会跟踪谁创建了哪些对象——这对于跟踪内存泄漏非常有用。如果您负担得起,请确保增加 VisualVM 的可用堆大小。
标签: java jvm crash segmentation-fault rhel