[mecab-devel 74] Re: Javaから高負荷に呼び出すとbad_alloc exceptionがthrowされる

Zurück zum Archiv-Index

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がメモリをなかなか開放できないことによって
メモリリークを起こしているのではと考えています。

何か対応策などございませんでしょうか?
御手数をおかけしますが、よろしくお願い致します。




Mecab-devel メーリングリストの案内
Zurück zum Archiv-Index