御厨 寛人
mikur****@datas*****
2007年 11月 2日 (金) 14:08:41 JST
御厨と申します。 Taggerクラスをスレッド毎にインスタンス化しているとのことでしたので、 参考になればと思い、投稿させていただきます。 ■MeCab0.96、Javaバインディングのテスト中にJava VMごと落ちます。 http://lists.sourceforge.jp/mailman/archives/mecab-devel/2007-July/000066.html 私の場合、スレッド内でTaggerクラスを生成していませんが、 多分同じ原因かと思います。 横から失礼しました。 tobit****@mail***** さんは書きました: > 工藤様 > > 御世話になっております。ムカイです。 > > ご連絡ありがとうございます。 > > >> 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がメモリをなかなか開放できないことによって > メモリリークを起こしているのではと考えています。 > > 何か対応策などございませんでしょうか? > 御手数をおかけしますが、よろしくお願い致します。 > > _______________________________________________ > Mecab-devel mailing list > Mecab****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/mecab-devel > > > -- データセクション株式会社 御厨 寛人 mikur****@datas***** 150-0051 東京都目黒区上目黒2-1-1 中目黒GTタワー20階 TEL : 03-5725-4763 FAX : 03-5725-4768