我编写了一个简短的应用程序,可以将文件从原始数据转换为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]
我怀疑它是我使用的图书馆导致这些,所以我不认为我可以做那么多来修复它。如果发生了这个错误,我运行程序然后让它从崩溃前的中断处开始。现在我必须手动执行此操作,但希望有一些方法让Eclipse重新启动程序(带有应该启动的文件名的参数)。有谁知道有没有办法做到这一点?
谢谢!
答案 0 :(得分:1)
目前尚不完全清楚,但我认为您说有一个第三方Java库(带有本机代码组件),您使用多个线程在一个JVM中运行。
如果是这样,我怀疑问题是第三方应用程序的本机部分没有正确的多线程,而 是崩溃的根本原因。 (我不希望你想要追查问题的原因......)
不要将一个JVM与多个转换器线程一起使用,而是使用多个JVM,每个JVM都有一个转换器线程。您可以通过静态分区工作或通过某种形式的排队机制在JVM上传播转换。
或者......您可以修改现有的包装器,以便线程使用ProcessBuilder在单独的JVM中启动转换器。如果转换器JVM崩溃,启动它的包装器线程可能会再次启动它。或者,它可以只记录转换失败并转移到下一个转换。 (您需要对重试有点小心,以防它正在转换的文件触发JVM崩溃。)
为了记录,我不知道现有的“现成”解决方案。
答案 1 :(得分:0)
您似乎正在使用Java的x86(32位)版本。也许你可以尝试使用x64(64位)版本。这有时对我有用。
问题似乎出现在本机库中,但是如果您使用64位Java进行尝试,它将使用64位版本的本机库?