在 linux 上运行涉及 JNI 调用的 Java 应用程序时,我注意到很少有类似下面的痕迹,看起来像崩溃。
但应用程序继续并成功。
“Java 运行时环境检测到一个致命错误:调用了纯虚拟方法”
上面的痕迹是什么意思?是什么导致了这次失败?我没有得到任何核心转储。即使有时我得到 coredump,每次的故障堆栈都是不同的。在这些电话中看起来没有任何问题。
请问有什么建议吗?
在 linux 上运行涉及 JNI 调用的 Java 应用程序时,我注意到很少有类似下面的痕迹,看起来像崩溃。
但应用程序继续并成功。
“Java 运行时环境检测到一个致命错误:调用了纯虚拟方法”
上面的痕迹是什么意思?是什么导致了这次失败?我没有得到任何核心转储。即使有时我得到 coredump,每次的故障堆栈都是不同的。在这些电话中看起来没有任何问题。
请问有什么建议吗?
根据我的经验:在启动新的 Java 之前,请确保您已经杀死了以前的 Java。并确保该过程已终止(在我的情况下,这需要一点时间)。只有这样,启动一个新的。
您可能还想为此添加 C/C++ 标记,因为这更多来自 C 端而不是 Java 端。您可能会得到更多/更好的答案。就我而言,这带有 GC 警告,但我尚未对此进行调查。
好读:
来自这些地方的两句话,据我所知,有些人希望他们的答案都集中在一个地方。
C2 维基:
顺便说一下,原因是子虚拟可能访问可能尚未构建或已被销毁的实例成员。因此,您不能将孩子称为虚拟。
汤巴塔的博客:
为什么会这样?因为我正在删除仍在使用的对象。
如果您没有任何纯虚函数,或者您确定确实是纯抽象的类,则该错误通常表示堆问题,例如尝试在已删除对象上调用方法。现在使用 JNI,我会怀疑 GC 问题。尝试使用内存调试器运行代码以追踪潜在问题。