我编写了一个简短的应用程序,将文件从原始数据转换为XML (ECG)。我有大约350000个文件要转换,转换本身是通过我从心电设备制造商那里得到的库完成的。为了利用机器中的多个处理器和核心来进行转换,我编写了一个“包装程序”,它创建了一个线程池,然后用于在单独的线程中进行转换。它的工作原理有点好,但不幸的是,我确实得到了导致整个应用程序停止的随机错误(85k文件在过去的3-4天中已经被转换,我有四个这样的错误):
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重新启动程序(带有文件名的参数)。有没有人知道有什么办法可以做到?
谢谢!
发布于 2014-09-26 06:46:20
还不完全清楚,但我认为您是说您有一个第三方Java库(带有本机代码组件),您使用多个线程在一个JVM中运行。
如果是这样的话,我怀疑问题在于第三方应用程序的本机部分没有正确的多线程,这是崩溃的根本原因。(我不认为你想找出问题的原因.)
与其使用一个JVM和多个转换器线程,不如使用多个JVM,每个JVM使用一个转换器线程。您可以通过静态地划分工作,或者通过某种形式的排队机制,在JVM之间扩展转换。
或者..。您可以修改现有的包装器,以便线程使用ProcessBuilder在单独的JVM中启动转换器。如果转换器JVM崩溃,启动它的包装线程可能会再次启动它。或者,它只需记录一下转换失败的情况,然后转到下一个转换。(您需要在重试时小心一些,以防正在转换的文件中的某些内容触发JVM崩溃。)
作为记录,我不知道现有的“现成”解决方案。
发布于 2014-09-26 06:26:40
您似乎正在使用x86 (32位)版本的Java。也许您可以尝试使用x64 (64位)版本。在过去,这对我来说是有用的。
问题似乎在本机库中,但是如果您用64位Java尝试它,它将使用64位版本的本机库?
https://stackoverflow.com/questions/26053192
复制相似问题