fra*_*eta 5 java tomcat jvm dump out-of-memory
在我的公司,我们在 Spring(Flex 前端)中开发一个企业 Web 应用程序,并以 SAAS 风格在 Tomcat 6 中将该应用程序部署给我们的客户。
最近,我们遇到了(看似)随机的 OutOfMemory 错误,因此经过调查,我知道我们应该在错误发生时检查 JVM 的内存转储。
我们使用的JVM是1.6.18,Tomcat版本是Windows Server 2008下的Tomcat 7.0.23。
我在 Tomcat 监视器面板(在 Java 选项卡下)中添加了参数 -XX:+HeapDumpOnOutOfMemoryError,但机器没有生成任何转储。
在我们正在调查的服务器上,完整的 java 选项设置如下:
-Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 7.0
-Dcatalina.base=C:\Program Files\Apache Software Foundation\Tomcat 7.0
-Djava.endorsed.dirs=C:\Program Files\Apache Software Foundation\Tomcat 7.0\endorsed
-Djava.io.tmpdir=C:\Program Files\Apache Software Foundation\Tomcat 7.0\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\logging.properties
-XX:PermSize=128m
-XX:MaxPermSize=1024m
-Xms1024m
-Xmx6144m
-XX:+HeapDumpOnOutOfMemoryError
-Dcom.sun.management.jmxremote.port=3333
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,最大堆大小非常大(6 Gigs),因为我们的应用程序特别重。出于测试原因,我添加了 jmx 参数,以便使用 VisualVM 实时查看 JVM 状态,但在查看时没有发生任何情况。
stderr 显示的所有内容如下:
java.lang.OutOfMemoryError
Run Code Online (Sandbox Code Playgroud)
它之前没有任何内容(除了我不知道是否相关的其他错误,但它们是在 OOM 之前数小时或几分钟记录的),之后也没有任何内容。
我觉得奇怪的是它没有报告内存部分(Java 堆大小,或 Permgen Space)。
也许保留的内存堆太大,JVM 无法写入它,因为它处于临界状态(OOM)?也许 JMX 参数把事情弄乱了?
这是当前运行的 JVM 的 VisualVM 屏幕截图:

更新:
我在另一个 tomcat 安装上安装了相同的 Web 应用程序(与问题产生的版本相同,并且具有相同的 java 选项),该应用程序经过修改,通过在无限循环中无限期地填充数组列表来手动引发 OOM。测试证明 java 选项 -XX:+HeapDumpOnOutOfMemoryError 有效,因为在我引发 OOM 后生成了内存转储;然而在这种情况下,错误是:
java.lang.OutOfMemoryError: Java Heap space
Run Code Online (Sandbox Code Playgroud)
接下来是堆栈跟踪。所以看来问题不在于我的 JVM args 表示法,而在于我遇到的特定类型的错误。
另一个特点是,在我的测试中抛出 OOM 错误后,该应用程序继续在 Tomcat 中运行。另一方面,我原来的问题中的 OOM 导致 Tomcat 服务停止。
遗憾的是,如果在停止前没有进行堆栈跟踪,则看起来很难进一步调查。:(
| 归档时间: |
|
| 查看次数: |
1098 次 |
| 最近记录: |