【问题标题】:Java application running in eclipse, random "fatal errors"在 Eclipse 中运行的 Java 应用程序,随机“致命错误”
【发布时间】:2014-09-26 06:15:43
【问题描述】:

我编写了一个简短的应用程序,将文件从原始数据转换为 XML (ECG)。我有大约 350000 个文件要转换,转换本身是通过我从 ECG 设备制造商处获得的库完成的。为了在我用来进行转换的机器中使用多个处理器和内核,我编写了一个“包装应用程序”,它创建了一个线程池,然后用于在单独的线程中进行转换。它工作得还不错,但不幸的是,我确实遇到了导致整个应用程序停止的随机错误(过去 3-4 天内已转换了 85k 个文件,我遇到了其中四个错误):

A fatal error has been detected by the Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x71160a6c, pid=1468, tid=1396

JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26)
Java VM: Java HotSpot(TM) Client VM (25.20-b23 mixed mode windows-x86 )
Problematic frame:
C  [msvcr100.dll+0x10a6c]

我怀疑是我使用的库导致了这些问题,所以我认为我无法修复它。如果发生该错误,我运行 then 程序并让它从崩溃前停止的地方开始。现在我必须手动执行此操作,但希望有某种方法可以让 Eclipse 重新启动程序(使用应该启动的文件名参数)。有谁知道有什么办法吗?

谢谢!

【问题讨论】:

  • 查看stackoverflow.com/questions/140030/…了解更多详情。这可能是那个问题的重复
  • 是的,谢谢,我应该自己发现...听起来很相似,而且我正在使用(或库正在使用)本机代码,DLL 可能会起作用。我查看了 hs_err_pid 文件,并不太了解。也许我可以把它上传到某个地方让别人看看。

标签: java eclipse fatal-error


【解决方案1】:

这并不完全清楚,但我认为您是在说您有一个使用多个线程在一个 JVM 中运行的第三方 Java 库(带有本机代码组件)。

如果是这样,我怀疑问题在于 3rd 方应用程序的本机部分没有正确地多线程,而 是崩溃的根本原因。 (我不希望你想追查问题的原因......)

不要使用具有多个转换器线程的 JVM,而是使用具有单个转换器线程的多个 JVM。您可以通过静态划分工作或通过某种形式的排队机制将转换分布在 JVM 中。

或者...您可以修改现有的包装器,以便线程使用 ProcessBuilder 在单独的 JVM 中启动转换器。如果转换器 JVM 崩溃,启动它的包装线程可以再次启动它。或者,它可以只记下失败的转换并继续进行下一个转换。 (您需要小心重试,以防您正在转换的文件引发 JVM 崩溃。)


郑重声明,我不知道现有的“现成”解决方案。

【讨论】:

  • 是的,这听起来很对。 :) 它确实看起来像第 3 方库/应用程序/本机代码并不能真正与多个线程一起使用(当查看我的包装器在转换线程启动时写入的控制台输出时,看起来也是这种情况;没有两个或多个线程同时启动,它们之间几乎总是有 2 秒,转换过程似乎每个需要 2 秒。毕竟可能不需要线程。
  • 好的,所以我删除了线程部分(无论如何在这种情况下并没有做太多事情),现在我正在使用您建议的方法,即使用 ProcessBuilder 为每个转换创建一个单独的 JVM。我想我会在星期一知道效果如何,但到目前为止看起来不错:) 再次感谢。
  • 哇,我刚刚尝试重新引入多线程,并为每次转换使用单独的 JVM,哇,现在它实际上可以工作了。之前只使用一个 JVM 实际上并没有执行任何线程,或者至少看起来像这样,因为一次只转换一个文件,但现在它一次执行 8 个。非常棒。不知道是什么原因。也许我之前使用的那个 JVM 只能访问一次本地 DLL,而不是使用 8 个线程。但这只是一些随机猜测。
【解决方案2】:

您似乎使用的是 x86(32 位)版本的 Java。也许您可以尝试使用 x64(64 位)版本。这在过去有时对我有用。

问题似乎出在原生库上,但如果你用 64 位 Java 尝试,它可能会使用 64 位版本的原生库?

【讨论】:

  • 不幸的是,我认为我不能,因为我正在使用的 jar 库那时不起作用。它不兼容 64 位。 :(
  • 嗯,线程是危险的,可能是因为你的本地库工作量过多。在这种情况下,您可能必须回到一个线程。这需要更长的时间,但不会崩溃。
猜你喜欢
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2023-03-14
相关资源
最近更新 更多