【发布时间】:2014-01-14 16:21:26
【问题描述】:
我一直在我的开发环境中运行 Glassfish 4
Windows
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
一切都很完美。
上周我部署到一个 Debian Linux 服务器上运行:
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1~deb7u1)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
在 Linux 环境中运行时,应用程序会间歇性崩溃。它已经运行了几天没有崩溃,然后在几个小时内崩溃了几次。当它崩溃时 glassfish 或 jvm 日志文件中没有错误消息,该过程就消失了,在一种情况下 jvm.log 包含被截断的行。到目前为止,我发现的唯一线索是 syslog 和 userlog 包含:
grep java *
syslog:Jan 14 13:41:19 omega-rm java: *** glibc detected *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double free or corruption (fasttop): 0x00007fb6ac076730 ***
syslog.1:Jan 13 19:48:04 omega-rm java: *** glibc detected *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double free or corruption (fasttop): 0x00007fb037835c90 ***
user.log:Jan 13 19:48:04 omega-rm java: *** glibc detected *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double free or corruption (fasttop): 0x00007fb037835c90 ***
user.log:Jan 14 13:41:19 omega-rm java: *** glibc detected *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double free or corruption (fasttop): 0x00007fb6ac076730 ***
user.log.1:Jan 8 10:19:30 omega-rm java: *** glibc detected *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double free or corruption (fasttop): 0x0000000007974a90 ***
user.log.1:Jan 8 14:29:11 omega-rm java: *** glibc detected *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double free or corruption (fasttop): 0x00000000082431f0 ***
user.log.1:Jan 8 14:57:19 omega-rm java: *** glibc detected *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double free or corruption (fasttop): 0x00007f805f87f490 ***
user.log.1:Jan 8 18:23:42 omega-rm java: *** glibc detected *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double free or corruption (fasttop): 0x00007eff39829ca0 ***
除了最后的地址之外,所有错误似乎都相同。所有时间都对应于服务器崩溃的时间,因此这似乎是服务器消失的原因。
有问题的应用程序是一个文档存储系统,它接受多种格式的文档并将它们存储在 MongoDB 中。在可能的情况下,它还会将图像呈现为 JPG 格式。
它使用 Apache PDF Box 和 Java Advanced Imaging 来渲染 JPG。它运行 Spring Framework、SpringData MongoDB 和 Spring Security。它偶尔会使用 jtds 进行数据库访问,但这并不常见,而且我相当确定在崩溃时没有发生任何数据库活动。最近发生了图像重新处理,但在大多数崩溃时已成功完成(未对所有问题进行验证,但对最近的崩溃进行了详细验证,并且已为最近保存的文档生成并保存了每个图像)。崩溃发生在最近的文档上传 50 秒后。
我在网上找到的几乎所有讨论都发生在 C 或 C++ 程序上,而且在那里是有意义的。我能想到的在Java程序中发生的唯一方法是通过JNI(我没有使用它,也许我正在使用的一些库做JNI,但如果是这样我不知道它)或一个 JVM 错误。
是否有人对尝试缩小导致此问题的原因有任何建议?
我可以打开任何日志记录或诊断以获取更多详细信息吗?
目前我唯一能想到的就是尝试在某些功能关闭的情况下运行应用程序一段时间(目前我最怀疑使用 PDF Box 进行 PDF 渲染),看看哪个功能组合是稳定的而不是。如果可能的话,我宁愿采用一种更明确的方法(而且这种方法不需要等待几天来查看测试是否有效!)。
【问题讨论】:
-
只是一个建议和猜测,但在我看来,似乎是 JVM 导致了问题。我还注意到您正在使用 openjdk。我总是用 Oracle 的“官方”二进制文件替换开放 Java,在 Ubunto 上做起来并不是特别困难(所以 可能 在 Debian 上也很容易)。我相信 Open Java 与 Java 标准不太兼容,但请不要引用我的话。您可以安装 Oracle Java 吗?
-
谢谢,我自己也想知道。理论上我可以完全访问机器,所以我可以安装任何版本的 Java。在实践中,我发现安装我安装的那个完全是一场噩梦。我还做了一些谷歌搜索,虽然我没有找到任何明确的东西,但看起来 OpenJDK 使用的 HotSpot JVM 与 Oracle 使用的相同。
-
Tim,这是一个非常好的 Ubuntu 指南:help.ubuntu.com/community/Java 使用
update-alternatives,这是我一直这样做的方式。我认为update-alternatives无论如何都来自 Debian 基地,所以你应该可以使用它。 -
@Kerry 谢谢,有机会我会试试的。希望明天。
-
我很想知道你对 Tim 的看法。干杯!
标签: java linux spring glassfish