2

在 linux 上运行涉及 JNI 调用的 Java 应用程序时,我注意到很少有类似下面的痕迹,看起来像崩溃。

但应用程序继续并成功。

“Java 运行时环境检测到一个致命错误:调用了纯虚拟方法”

上面的痕迹是什么意思?是什么导致了这次失败?我没有得到任何核心转储。即使有时我得到 coredump,每次的故障堆栈都是不同的。在这些电话中看起来没有任何问题。

请问有什么建议吗?

4

2 回答 2

0

根据我的经验:在启动新的 Java 之前,请确保您已经杀死了以前的 Java。并确保该过程已终止(在我的情况下,这需要一点时间)。只有这样,启动一个新的。

您可能还想为此添加 C/C++ 标记,因为这更多来自 C 端而不是 Java 端。您可能会得到更多/更好的答案。就我而言,这带有 GC 警告,但我尚未对此进行调查。

好读:

  1. http://c2.com/cgi/wiki?PureVirtualFunctionCalled
  2. http://tombarta.wordpress.com/2008/07/10/gcc-pure-virtual-method-call/

来自这些地方的两句话,据我所知,有些人希望他们的答案都集中在一个地方。

C2 维基:

顺便说一下,原因是子虚拟可能访问可能尚未构建或已被销毁的实例成员。因此,您不能将孩子称为虚拟。

汤巴塔的博客:

为什么会这样?因为我正在删除仍在使用的对象

于 2014-01-23T15:33:40.033 回答
0

如果您没有任何纯虚函数,或者您确定确实是纯抽象的类,则该错误通常表示堆问题,例如尝试在已删除对象上调用方法。现在使用 JNI,我会怀疑 GC 问题。尝试使用内存调试器运行代码以追踪潜在问题。

于 2012-05-03T07:05:42.383 回答