我们有一个 Java 应用服务器,用于实时音频/视频处理,为此,它消耗了大量内存(25+GB RAM)。由于我们的 JNI 中存在一些未知的错误,我们的 JVM 时不时会崩溃。
我们的服务器在运行Ubuntu 16.04.2 LTS
,当我们的 JVM 崩溃时,它的行为非常奇怪。它开始将堆转储转储到/var/crash
,大小达到 ~1.4GB(压缩后)并停止,用 50KB 的数据覆盖堆转储。
报告日志:
ERROR: apport (pid 30913) Tue Oct 23 12:38:49 2018: called for pid 29206, signal 6, core limit 0
ERROR: apport (pid 30913) Tue Oct 23 12:38:49 2018: executable: /usr/lib/jvm/java-8-oracle/bin/java (command line "<JAVA COMMAND AND OPTIONS GO HERE>")
ERROR: apport (pid 30913) Tue Oct 23 12:38:49 2018: is_closing_session(): no DBUS_SESSION_BUS_ADDRESS in environment
ERROR: apport (pid 30913) Tue Oct 23 12:59:30 2018: core dump exceeded 11238 MiB, dropped from /var/crash/_usr_lib_jvm_java-8-oracle_bin_java.0.crash to avoid memory overflow
ERROR: apport (pid 30913) Tue Oct 23 12:59:30 2018: wrote report /var/crash/_usr_lib_jvm_java-8-oracle_bin_java.0.crash
看起来这apport
相当难以预测。除此之外,与所说的相反apport
,它没有利用kernel.core_uses_pid
- 每个堆转储都使用名称_usr_lib_jvm_java-8-oracle_bin_java.0.crash
。
- 是否有其他方法可以
apport
捕获 java 堆转储? - 如果没有,有没有办法捕获整个堆转储?
- 最后,怎么样
core_uses_pid
?Apport
的来源建议应该使用它,但文件名却有所不同。
如果我可以用任何其他信息更新问题,请随时询问。谢谢!