如何调试 JVM 中发生的 Segfaults(当 JVM 运行我的代码)时?
我的Java应用程序已经开始定期崩溃,有一个SIGSEGV和堆栈数据转储以及文本文件中的信息负载。
我已经在gdb中调试了C程序,并且从IDE中调试了Java代码。我不确定如何在正在运行的Java程序中处理类似C的崩溃。
我假设我在这里没有看到JVM错误。其他Java程序运行良好,Sun的JVM可能比我的代码更稳定。但是,我不知道我怎么会用Java代码导致segfaults。肯定有足够的内存可用,当我上次检查探查器时,堆使用率约为50%,偶尔峰值约为80%。是否有任何可以调查的启动参数?在处理这样的错误时,什么是好的清单?
虽然到目前为止我无法可靠地重现事件,但它似乎也不是完全随机发生的,因此测试并非完全不可能。
ETA:一些血腥的细节
(我正在寻找一种通用方法,因为实际问题可能非常具体。不过,我已经收集了一些信息,这些信息可能有一定的价值。
不久前,我在升级CI服务器后遇到了类似的麻烦(请参阅此处了解更多详细信息),但这次修复(设置)没有帮助。-XX:MaxPermSize
进一步的调查显示,在崩溃日志文件中,标记为“当前线程”的线程从来都不是我的线程之一,而是称为“VMThread”的线程或称为“GCTaskThread”的线程 - 如果是后者,则另外标有注释“(已退出)”,如果是前者,则GCTaskThread不在列表中。这使我认为问题可能在GC操作结束时。