JAVAのゴミ集め(ガベージコレクション)

JAVAのいいところは、メモリーリークを回避するようにガベージコレクション(以下、GC)をやってくれるところだ。

いつだったか、Objective-Cで、iphoneアプリを作っているときは、細かい神経の多くをメモリーリーク回避のために使って、人間が疲れてしまう感じだった。そういう意味ではGCはとてもありがたい。

prolog化のプログラムはjavaで書いているので、core-i9 9920Xと128Gメインメモリと合わされば、およそメモリ問題はあり得ない気になっていた。

しかし、この間、twitterテキストのprolog化のために一つのプログラムを10時間以上連続で動かし続けていると、プロセスがメモリがやたら食っていくのだ。

例えば、いま、動かしているのだが、こんな状況である。(ターミナルからtopを実行した結果)

KiB Mem : 13172568+total, 10442336 free, 11123846+used, 10044876 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used. 19345396 avail Mem

111ギガ使って、残りは10ギガしかないって言っている。javaは、最大使用メモリを110Gバイトとして動かしているので、もう目一杯使っている感じだ。増えに増えていくので、ガベージコレクションはどうした!!という感情になる。

ただ、javaバーチャルマシン(VM)では、これは特に珍しいことではないようだ。VMは、実際のメモリを使い切らないように発表の場を探しているようだから。実メモリがなくなりそうな時まで、GCは、実行されないように見えると書いてあった。

Jumanの死

1億1千万ツイートのprolog化も、最終局面に来ている。トラブルがなければ、明日の朝には、終わっているはずだ。

前の記事からの進展は、サーバーモードのJumanが、耐えられなくなって死んでしまうという現象を回避するようにしたことだ。

全てのツイッターを4分割して、その三つ目をやっているときに、どうしてもSocketExceptionエラーが発生して、サーバーモードのJumanのソケットが死んでしまって、そのスレッド自体がフリーズしてしまうという現象が発生するようになった。そうなると、他はうまくやっているようなのだが、私の方が続ける気が無くなって、全体を止めてしまうというのが繰り返された。(一つのスレッドに、一つのJumanを、ポートを変えて立ち上げているので、他のJumanには影響を与えない)

よくよく原因を調べると、異常なツイートにJumanが疲弊してしまったようだ。ツイートの中に、次のような二つのツイートが続いてあった。

かぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁわぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁいぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃε=ε=(ノ≧∇≦)ノ#ボタンインコ#インコ
【1週間限定】セブン-イレブン、かわいすぎるXmasスイーツが登場sCMXcバニラといちごのサンタケーキ、チョコとクッキーのトナカイケーキ、いちごムースを使った柊のケーキを展開しています。 https…

この二つのツイート、それぞれ単独では、prolog 化できるのだが、続けると必ず、二つ目の文章のJumanによる形態素解析の場面で、SocketExceptionエラーが発生してしまう。Jumanのプログラムを調べていないので(ソースはあるが、面倒でできない)よくわからないが、最初の文章でJumanが内部エラーを引き起こしてしまっているようなのだ。

さらに調べると、最初の「ぁぁぁぁぁぁぁぁ」あるいは「ぃぃぃぃぃ」というような文字の連続を一部やめる(少し短くする)と、続けても問題なくprolog化できる。およそ、このツイートは日本語ではないので、Jumanが投げ出してしまう気持ちもよく理解できる。(元文章はなるべくいじらず、可能な限り受け入れようというのがポリシーだ。そうすることによって、どんな文章にもprolog化アルゴリズムが適用できるだろうと思っているので)

内部エラーを起こして、フリーズしてしまうのは実は係り受け解析のKNPなのだ。なぜそうなるのかというと、Jumanの内部エラーで、中途半端に構文解析終えて、最後にEOSを返さないのだ。そのために、EOSをKNPがいつまでも待つという形でスレッドがフリーズする。だから、最後にEOSをあえてつけるようにしたが、それでKNPはフリーズしなくなるのだが、その後Jumanは動かなくなってしまうので、処理が進まない。

結局、先のような同一文字が5文字以上続いているような文章は、prolog化の対象から外すことにした。正規表現の後方参照で、そのような連続文字をチェックできる。

ただ、そうしてみると、ツイッターの中には、そうした同一文字の連続うちという現象がいたるところで観れる。だから、多少躊躇したが、そんなの文章じゃないだろうという思いの方が打ち勝って、この基準を導入することにした。

今、最後の1/4を実行している。210このスレッドが動いている。早くて超高機能のパソコンのおかげで、大きな問題なくここまできた。