JMagick and JVM crashes



我正在使用JMagick,并有一个简单的Java类,它循环遍历目录(及其子目录)中的所有图像,将图像转换为灰度图像。

应用程序运行一段时间后,JVM崩溃了。我认为日志中的错误消息可能表明存在内存问题:

Java框架:(J=编译Java代码,J=解释Java代码,Vv=虚拟机代码)Jmagick.MagickImage.writeImage (Lmagick/ImageInfo;)Z + 0 jcom.example.ImageGenerator.generateAlternativeImages (Ljava/io/文件;Z) V + 91j com.example.ImageGenerator.main ((Ljava/lang/String;)V + 58~ StubRoutines: call_stub

--------------- P R O C E S S ---------------

Java线程:(=>当前线程)0x0ab0c800 JavaThread "低内存检测器"守护进程[_thread_blocked, id=1532,0x0ab0ac00 JavaThread . stack(0x0aec0000,0x0af10000)] 0x0ab0ac00"CompilerThread0"守护进程[_thread_blocked, id=7304,stack(0x0ae70000,0x0aec0000)] 0x0aafe000 JavaThread "JDWP命令Reader" daemon [_thread_in_native, id=6836,0x0aafc800 JavaThread "JDWP事件辅助线程"守护进程[_thread_blocked, id=7248,0x0aafa400 JavaThread "JDWP传输监听器:dt_socket" daemon [_thread_blocked, id=6252,stack(0x0ad80000,0x0add0000)] 0x0aaee800 JavaThread "附加守护进程[_thread_blocked, id=2020,stack(0x0aca0000,0x0acf0000)] 0x0aaed400 JavaThread "信号Dispatcher" daemon [_thread_blocked, id=7492,stack(0x0ac50000,0x0aca0000)] 0x0aada400 JavaThread "Finalizer"守护进程[_thread_blocked, id=5400, stack(0x0ac00000,0x0ac50000)]
0x0aad8c00 JavaThread "Reference Handler"守护进程[_thread_blocked,]id = 5772,堆栈(0 x0abb0000 0 x0ac00000)]=>0x002b8000 JavaThread "main" [_thread_in_native, id=7020,堆栈(0 x008c0000 0 x00910000)]

其他线程:0x0aad5400 VMThread [stack: 0x0ab60000,0x0abb0000][id=7720] 0x0ab0f000 WatcherThread [stack: 0x0af10000,0x0af60000][id = 6432]

虚拟机状态:not at safepoint(正常执行)

当前线程拥有的虚拟机互斥锁/监控器:无

Heap def new generation total 960K, used 793K [0x029c0000];0x02ac0000, 0x02ea0000)伊甸园空间896K, 88%使用[0x029c0000,0x02a865f0, 0x02aa0000)从空间64K, 0%使用[0x02aa0000,0x02ab0000, 0x02ab0000)到64K空间,0%使用[0x02ab0000,0x02ab0000, 0x02ac0000)终身代总计4096K,使用0K[0x02ea0000, 0x032a0000, 0x069c0000]空间4096K, 0%已使用[0x02ea0000, 0x02ea0000, 0x02ea0200, 0x032a0000]压实烫发器总共12288K,使用了2219K [0x069c0000, 0x075c0000, 0x0a9c0000]空间12288K, 18%已使用[0x069c0000, 0x06bead18, 0x06beae00,0x075c0000)未配置共享空间告警解释

我试过添加-Xmx选项,但figure这可能不是解决方案。有什么建议吗?

您的JVM崩溃了,-Xmx不起作用。您可以尝试运行-Xint,看看是否可以重现这个问题吗?这将告诉JVM在没有热点的情况下运行,这意味着没有动态编译优化。您使用的是哪个版本的JVM ?如果您不能在-Xint中重现这个问题,并且您使用的是最新的JVM,那么您可以尝试只将magick.MagickImage.writeImage排除在编译之外。

要排除,在应用程序工作目录中创建一个名为

的文件:
.hotspot_compiler 

并加上一行:

exclude magick/MagickImage writeImage

如果您怀疑这是内存问题,那么使用选项-XX:+HeapDumpOnOutOfMemoryError运行应用程序。如果应用程序由于OOME而崩溃,这将创建堆转储。然后可以使用jhat或eclipse mat等工具分析堆转储。

您还可以使用jmap生成正在运行的应用程序的堆转储,并使用上面建议的工具查看内存消耗,以确保您的怀疑。

我发现您需要销毁您创建的每个图像副本。否则就会造成内存泄漏。它使用JNI,我认为有malloc需要被释放。

相关内容

  • 没有找到相关文章

最新更新