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 "Low Memory Detector" デーモン [_thread_blocked, id=1532, stack(0x0aec0000,0x0af10000)] 0x0ab0ac00 JavaThread "CompilerThread0" デーモン [_thread_blocked, id=7304, stack(0x0ae70000, 0x0aec000) ] 0x0aafe000 JavaThread "JDWP Command Reader" デーモン [_thread_in_native, id=6836, stack(0x0ae20000,0x0ae70000)] 0x0aafc800 JavaThread "JDWP Event Helper Thread" デーモン [_thread_blocked, id=7248, stack(0x0add0000,0x0ae20000)] JavaThread 40"DWPafa0"トランスポート リスナー: 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/モニター: なし

Heap Def Nef Generation Total 960K、793K [0x029C0000、0x02AC0000、0x02EA0000)Eden Space 896K、88%は[0x029C0000、0x02A865F0、0x02AA0000)を使用しました。使用[0x02AB0000、0x02AB0000、0x02AC0000)テニュード生成合計4096K、0K [0x02EA0000、0x032A0000、0x069C0000)スペース4096K、0%使用、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 に答える