- 締切済み
JVMで異常終了。メモリ不足の可能性はないでしょうか?
JVMで異常終了。メモリ不足の可能性はないでしょうか? ネットワーク越しにファイルアクセスを行っている最中に、時々、JVMでネイティブコードレベルのエラーが発生します。エラー後、同じ処理を再実行すると、正常に処理が行えています。ネットワークに負荷がかかっているときに発生しているようにも感じるのですが、JVMのメモリが不足しているということは考えられないでしょうか。ただし、エラー時のトレースには、メモリ不足に関するメッセージは出力されていません。可能性として、このようなことは考えられないかどうか、ご教授いただけると助かります。宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
ANo.1で回答した者です。お礼メッセージをありがとうございます。 そのエラーですと、メモリ不足ではなく、メモリが二重解放されているようです。 たとえば、newとdeleteが対応しておらず、一度のnewに対して2回deleteされていることなどが考えられます。 詳細にトレースしないと、エラー箇所の特定まではできません。
- e00083
- ベストアンサー率31% (25/80)
>JVMのメモリが不足しているということは考えられないでしょうか。 考えられますが その原因を突き止めるためには、エラーを出力するようにプログラムする必要があります。 そもそも、些細なコードミスでもメモリ不足は起こります。 まして、ネットワーク越しなら、メモリ不足以外にも原因は考えられます。
お礼
ありがとうございます。 ネットワークといっているのは、NFSサーバ上に置いたファイルにアクセスするというものです。 確かにメモリ不足以外にもあるとは思うのですが、他の観点からなかなか情報が得られなかった のでメモリ不足を疑ってみました。 原因追求にはプログラムを直してみるのがやはり一番ですよね。 ちなみに、発生しているエラーは、JNU_ReleaseStringPlatformCharsという関数での「double free or corruption(out)」というものになります。
- askaaska
- ベストアンサー率35% (1455/4149)
そもそもどのようなエラーが発生しているのかわからないので 断定どころか推測すらできないわ。 ネットワーク負荷が原因なら それによって接続が遮断されたのかもしれない。 実際にどんな処理なのかわからないけど サイズの大きなファイルを制限なく読み込むのなら メモリ不足もありそうね。 そうでなくても、きちんとリソースの開放をしていないのなら メモリ不足もありそうね。 実際どのくらいメモリを使っているのか 調べてみてはいかがかしら?
お礼
回答ありがとうございます。 メモリ使用量については確認します。ネットワーク負荷についても自分で確認してみた わけではないのであらためて確認してみるつもりです。 サイズの大きなファイル・・・ですが、扱っているファイルのサイズが数GBにもなるもの ですので、メモリ不足もあるかと考えてみました。 実際発生しているエラーは、「double free or corruption (out)」というものです。 メモリ不足を引き金として処理に異常をきたしてこのようなエラーが出ることはないの かなという疑問から投稿させていただいていました。 接続遮断についても疑ってはいるのですが、それを実証するログが残っておらず、 調査が難航しています。
JVMのエラーログを拝見しないと、何とも回答のしようがありません。 よろしくお願いします。
お礼
回答ありがとうございます。 エラーログ(抜粋)ですが、 jdk1.6.0_02/jre/bin/java: double free or corruption (out): 0x00000000529c6560 ======= Backtrace: ========= /lib64/libc.so.6 /lib64/libc.so.6(cfree+0x8c) jdk1.6.0_02/jre/lib/amd64/libjava.so(JNU_ReleaseStringPlatformChars+0xc) jdk1.6.0_02/jre/lib/amd64/libjava.so(Java_java_io_UnixFileSystem_getBooleanAttributes0+0xbc) ・・・ のような感じです。 NFSサーバ上にあるファイルにアクセスしている時にごくたまに発生し、エラー後、 そのままリターン(再実行)すると今度は正常にいきます。
お礼
お礼が遅れまして申し訳ありません。 回答ありがとうございました。 ご教授いただいた通り何かのタイミングで2回freeしてしまっているか、または、本当は解放されていない状態なのに、free時には解放されていると認識される状態に陥ってしまっている、ということが起こっているのではないかと考えています。 javaネイティブコードで発生しているのであまり深いところまでは追えていないのですが、もっと踏み込んで確認してみようと思います。