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どころでは済まなくなってしまいます。。 また何か気になる点がございましたら、ご指摘いただけると助かります。 よろしくお願い致します。