2

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

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

Java 帧:(J=编译的 Java 代码,j=解释的,Vv=VM 代码)j magick.MagickImage.writeImage(Lmagick/ImageInfo;)Z+0 j com.example.ImageGenerator.generateAlternativeImages(Ljava/io/File;Z )V+91 j com.example.ImageGenerator.main([Ljava/lang/String;)V+58 v ~StubRoutines::call_stub

- - - - - - - - 过程 - - - - - - - -

Java线程:(=>当前线程)0x0ab0c800 JavaThread“低内存检测器”守护进程[_thread_blocked,id = 1532,堆栈(0x0aec0000,0x0af10000)] 0x0ab0ac00 JavaThread“CompilerThread0”守护进程[_thread_blocked,id = 7304,堆栈(0x0ae70000,0x0aec) ] 0x0aafe000 JavaThread “JDWP 命令读取器”守护进程 [_thread_in_native, id=6836, stack(0x0ae20000,0x0ae70000)] 0x0aafc800 JavaThread “JDWP 事件帮助线程”守护进程 [_thread_blocked, id=7248, stack(0x0add0000,0x0ae20000 JavaThread)]传输侦听器: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, stack(0x0ac00000,0x0ac50000)]
0x0aad8c00 JavaThread“引用处理程序”守护进程 [_thread_blocked, id=5772, stack(0x0abb0000,0x0ac00000)] =>0x002b8000 JavaThread“main” [_thread_in_native, id=7020, stack(0x008c0000,0x00910000)]

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

VM 状态:不在安全点(正常执行)

VM Mutex/Monitor 当前由一个线程拥有:无

HEAP DEF新一代总计960K,使用了793K [0x029C0000,0x02AC0000,0x02EA0000)Eden Space 896K,88%使用[0x029c0000,0x02a865f0,0x02aa0000),从空间64K,0%到0%至0%至0500 0002a000000000000)0x02aaaaaaaaaaaa使用[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 选项,但认为这可能不是解决方案。有什么建议么?

提前致谢。

4

3 回答 3

4

您的 JVM 崩溃了,-Xmx将无济于事。您可以尝试运行-Xint并查看是否可以重现问题吗?这将告诉 JVM 在没有Hotspot 的情况下运行,这意味着没有动态编译优化。您正在使用哪个版本的 JVM?如果您无法重现问题-Xint,并且您使用的是最新的 JVM,则可以尝试仅从magick.MagickImage.writeImage编译中排除。

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

.hotspot_compiler 

并添加以下行:

exclude magick/MagickImage writeImage
于 2011-09-09T17:46:43.717 回答
2

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

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

于 2011-09-09T18:00:55.380 回答
0

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

于 2014-12-11T23:22:36.127 回答