我使用的是JMagick,它有一个简单的Java类,它遍历目录(及其子目录)中的所有图像,将图像转换为灰度图像。
在我的应用程序运行了一段时间之后,JVM就崩溃了。我认为日志中的错误消息可能意味着存在内存问题:
Java帧:( magick.MagickImage.writeImage(Lmagick/ImageInfo;)Z+0 com.example.ImageGenerator.generateAlternativeImages(Ljava/io/File;Z)V+91 j com.example.ImageGenerator.main([Ljava/lang/String;)V+58 v ~StubRoutines::call_stub ) (J=compiled Java代码、j=interpreted、Vv=VM代码) JavaThread:( =>当前线程) 0x0ab0c800 JavaThread“低内存检测器”守护进程_thread_blocked,id=1532,堆栈(0x0aec000x0af10000) 0x0ab0ac00 JavaThread "CompilerThread0“守护进程_thread_blocked,id=7304,堆栈(0x0ae70000,0x0aec0000) 0x0aafe000 JavaThread "JDWP命令读取器”守护进程_thread_blocked,id=6836,堆栈(0x0ae200000x0ae70000)堆栈(0x0ad800000x0add0000) 0x0aaee800 JavaThread“附加侦听器”守护进程_thread_blocked,id=2020,堆栈(0x0aca000x0acf0000)0x0aed400 JavaThread“信号调度员”守护进程_thread_blocked,id=7492,堆栈(0x0ac500000x0aca0000) 0x0aada400 JavaThread“终结器”守护进程_thread_blocked,id=5400,堆栈(0x0ac00000,0x0ac50000) 0x0aad8c00 JavaThread“引用处理程序”守护进程_thread_blocked,id=5772,堆栈(0x0abb0000,0x0ac00000) =>0x002b8000 JavaThread“主”_thread_in_native,id=7020,堆栈(0x008c0000,0x00910000) 其他线程: 0x0aad5400 VMThread堆栈:0x0ab600000,0x0abb0000 0x0ab0f000 WatcherThread堆栈: 0x0af10000,0x0af60000 VM状态:不在safepoint (正常执行) 当前由线程拥有的VM Mutex/Monitor :无 堆总数960K,从空间64K使用793K [0x029c0000,0x02ac0000,0x02e0000) eden空间896K,88%使用[0x029c0000,0x02c0000,0x02a0000,0x02a0000],使用空间64K(0x02a0000,0x02a0000,0x02ab0000)到空间64K,0%使用[0x02ab0000,0x02ab0000,0x02ac0000,0x02ac0000,0x026K,使用0K [0x02ea0000,0x032a0000,0x069c96K]空间使用40K[0x02x0000,0x0x0000,0x069c96K]。18%使用[0x069c0000,0x06bead18,0x06beae00,0x075c0000]没有配置共享空间。
我尝试过添加-Xmx选项,但认为这可能不是解决方案。有什么建议吗?
提前谢谢。
发布于 2011-09-09 17:46:43
你的JVM崩溃了,-Xmx也帮不上忙。您能尝试使用-Xint运行并查看是否可以重现问题吗?这将告诉JVM在没有热点的情况下运行,这意味着没有动态编译优化。您使用哪个版本的JVM运行?如果您不能重现-Xint的问题,并且正在使用最新的JVM,则可以尝试将magick.MagickImage.writeImage排除在编译之外。
若要排除,请在应用程序工作目录中创建一个文件,名为:
.hotspot_compiler 加上一行:
exclude magick/MagickImage writeImage发布于 2011-09-09 18:00:55
如果怀疑这是内存问题,那么使用-XX:+HeapDumpOnOutOfMemoryError选项运行应用程序。如果应用程序由于OOME而崩溃,这将创建堆转储。然后,您可以使用jhat或eclipse等工具来分析堆转储。
您还可以使用jmap生成正在运行的应用程序的堆转储,并使用上面建议的工具查看内存消耗情况,以确保您的怀疑。
发布于 2014-12-11 23:22:36
我发现你需要销毁你创建的每一个图像副本。否则,您将创建内存泄漏。它正在使用JNI,我认为存在需要释放的恶意代码。
https://stackoverflow.com/questions/7364873
复制相似问题