我正在使用JMagick并且有一个简单的Java类,它循环遍历目录(及其子目录)中的所有图像,将图像转换为灰度图像。
我的应用程序运行一段时间后,JVM崩溃了。我相信日志中的错误消息可能暗示存在内存问题:
Java框架:( J =已编译的Java代码,j =已解释,Vv = VM代码)j magick.MagickImage.writeImage(Lmagick / ImageInfo;)Z + 0 j com.example.ImageGenerator.generateAlternativeImages(Ljava / IO /文件; Z)V + 91 j com.example.ImageGenerator.main([Ljava / lang / String;)V + 58 v 〜StubRoutines :: call_stub
--------------- P R O C E S S ---------------
Java线程:( =>当前线程)0x0ab0c800 JavaThread“低 内存检测器“守护进程[_thread_blocked,id = 1532, stack(0x0aec0000,0x0af10000)] 0x0ab0ac00 JavaThread “CompilerThread0”守护进程[_thread_blocked,id = 7304, stack(0x0ae70000,0x0aec0000)] 0x0aafe000 JavaThread“JDWP命令 读者“守护进程[_thread_in_native,id = 6836, stack(0x0ae20000,0x0ae70000)] 0x0aafc800 JavaThread“JDWP事件 Helper Thread“守护进程[_thread_blocked,id = 7248, 堆栈(0x0add0000,0x0ae20000)] 0x0aafa400 JavaThread“JDWP Transport 监听器:dt_socket“守护进程[_thread_blocked,id = 6252, stack(0x0ad80000,0x0add0000)] 0x0aaee800 JavaThread“附加 监听器“守护进程[_thread_blocked,id = 2020, stack(0x0aca0000,0x0acf0000)] 0x0aaed400 JavaThread“Signal Dispatcher“守护进程[_thread_blocked,id = 7492, stack(0x0ac50000,0x0aca0000)] 0x0aada400 JavaThread“Finalizer” 守护进程[_thread_blocked,id = 5400,堆栈(0x0ac00000,0x0ac50000)]
0x0aad8c00 JavaThread“引用处理程序”守护程序[_thread_blocked, id = 5772,堆栈(0x0abb0000,0x0ac00000)] => 0x002b8000 JavaThread“main”[_thread_in_native,id = 7020, 栈(0x008c0000,0x00910000)]其他主题:0x0aad5400 VMThread [stack:0x0ab60000,0x0abb0000] [id = 7720] 0x0ab0f000 WatcherThread [stack:0x0af10000,0x0af60000] [ID = 6432]
VM状态:不在安全点(正常执行)
VM Mutex / Monitor当前由线程拥有:无
堆def新一代总计960K,使用了793K [0x029c0000, 0x02ac0000,0x02ea0000)伊甸园空间896K,88%使用[0x029c0000, 来自空间64K的0x02a865f0,0x02aa0000),0%使用[0x02aa0000, 0x02aa0000,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选项,但认为这可能不是解决方案。有什么建议吗?
提前致谢。
答案 0 :(得分:4)
您的JVM崩溃了,-Xmx
无济于事。您可以尝试使用-Xint
运行,看看是否可以重现问题?这将告诉JVM在没有 Hotspot的情况下运行,这意味着没有动态编译优化。您运行的是哪个版本的JVM?如果您无法使用-Xint
重现该问题,并且您正在使用最新的JVM,则可以尝试仅从编译中排除magick.MagickImage.writeImage
。
要排除,请在名为“
”的应用程序工作目录中创建一个文件.hotspot_compiler
并添加以下行:
exclude magick/MagickImage writeImage
答案 1 :(得分:2)
如果您怀疑它是内存问题,请使用选项-XX:+ HeapDumpOnOutOfMemoryError运行应用程序。如果应用程序因OOME而崩溃,这将创建堆转储。然后,您可以使用jhat或eclipse mat等工具分析堆转储。
您还可以使用jmap生成正在运行的应用程序的堆转储,并使用上面建议的工具查看内存消耗,以确保您的怀疑。
答案 2 :(得分:0)
我发现你需要销毁你创建的每个图像副本。否则,您会创建内存泄漏。它正在使用JNI,我认为有些mallocs需要被释放。