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

Back to archive index

tobit****@mail***** tobit****@mail*****
2007年 11月 2日 (金) 14:46:30 JST


おおつか様

御世話になっております。ムカイです。
早速のご回答ありがとうございます。

> java のヒープを -Xmx にて指定していると思うのですが
> -Xms は指定されていますでしょうか?
こちらの設計都合になってしまいますが、現在-Xmsと-Xmxを256Mに設定し、
Javaを同一筐体に12インスタンス起動しています。
よって合計3Gになります。。
#申し訳ございません。。細かな説明が出来ていませんでした。。

ご指摘のとおり、インスタンスの数を絞るなどしてヒープをあけてやれば、本件
は発生しにくくなるのではと考えていますが、パース処理の総量が増え、
mecabのインスタンスをつんでいくと、起動したインスタンスの量とGCが
開放できたインスタンスの量の開きが大きくなり、結果としてメモリリークと
なってしてしまいますので、どの程度のメモリを余力として残しておけば
よいのかを決定することが難しくなっています。。
また、マルチスレッドからの呼び出しを行っている関係で、mecabのインス
タンスを使いまわすことも難しい状況です。

そもそも論となりますが、C/C++のインターフェースでmecabを使用した場合は
処理が終わった段階で明示的にメモリを開放しますので、正しくメモリ開放を
行っていけばメモリリークは起こらず、メモリ使用量も推測しやすいので
対応がしやすいことと、パース処理のコストが高いことからも、何か根本的な
解決がないものかと考えた次第です。。

今回のような場合は、JVMが管理している以外のメモリもCG都合で開放と
いうことになりますので、メモリ消費の面でも厳しく感じています。。
#解析前の文字列や解析後のノードをJavaとネイティブで管理すると
#×2でメモリを消費してしまいます。。

また、mecabがallocateに失敗した場合、bad_allocをthrowしてしまいます
ので、terminateがコールされてしまい、結果としてJavaのインスタンスを
丸ごと落としてしまいます。。
#OOMどころでは済まなくなってしまいます。。

また何か気になる点がございましたら、ご指摘いただけると助かります。
よろしくお願い致します。




mecab-users メーリングリストの案内
Back to archive index