tobit****@mail*****
tobit****@mail*****
2007年 11月 2日 (金) 13:22:03 JST
工藤様 御世話になっております。ムカイです。 ご連絡ありがとうございます。 > Javaに関してはド素人なのですが、Java VM のメモリー使用量に > 制限があったりしないでしょうか? 私の認識不足でしたが、Javaを立ち上げると起動時に設定した メモリ最大使用量分のメモリがヒープから予約されるようです。 現在、物理メモリの容量が4Gのマシンで動作させていますが、JavaVM に3Gのメモリを割り当てており、ヒープとして使用できる容量は 残り1Gとなっているようです。 JavaVMが予約した3Gをフルで確保(allocate)しているわけではないので ヒープの空き容量は多くありますが、3GはJavaによって予約されている のでヒープとして使用できるのは1Gとなってしまうようです。 調べたところによりますと、JavaからJNI経由でライブラリを呼び出した際も ネイティブのライブラリはヒープから直接メモリを確保するようですので、 単に上記の1Gが枯渇してしまったのではないかと考えています。 #これまではメモリの空きばかりを確認していました。。 > 処理ごととは具体的にどういう風に生成していますか? Javaでスレッドを生成して並列で呼び出していますので、スレッド単位 で1インスタンスを生成しています。スレッド内ではインスタンスを 使いまわしています。 > mecab のインスタンス化は非常にコストが高いので、 > できるだけインスタンスを使いまわしたほうが、パフォーマンスがよいです。 スレッドセーフにするには、インスタンスをスレッドごとにわけた方が良い とのことでしたので、現在はそのように処理しています。複数のスレッドで 同じインスタンスを使いまわしていたところ、メモリ違反が発生していまいた。。 > インスタンスの解放をGCに任せているのであれば、GCのタイミング > によってはかなりのメモリーを使う状況になりかねません。 現在のJNIのつくりでは、GCのタイミングでJava側のメモリおよびC側のメモリ を開放していますので、GCがメモリをなかなか開放できないことによって メモリリークを起こしているのではと考えています。 何か対応策などございませんでしょうか? 御手数をおかけしますが、よろしくお願い致します。