GCによってしか開放されないリソースがあった

下記のようなケースに近いケースに遭遇したので、DisableExplicitGCのオプションを指定しました。

How we solved – GC every 1 minute on Tomcat | Sumit Pal's Blog  

しかし、私たちのほうで運用しているサービスのソースコード自体ではなく、インクルードしているライブラリの中に明示的なGCが必要な箇所があったらしく、障害を招いてしまいました。

具体的には、コネクションが開放されずに溜まっていってファイルディスクリプタの上限を超えてしまったというものです。ただ、これがタイミングの問題で起きるものであり、すべてのサーバーで必ず発生するわけではなかったのと、同時並行でいろいろな機能をリリースしているため、どの変更箇所が影響して問題が起きているのか分かりづらかったのが、特定に時間がかかった要因です。

これまで定期的にGCが走っていたため気がつきませんでしたが、GCが明示的にリソースを開放してくれていることで安定して動いていた側面があったようです。そのコードはライブラリ側のコードだったので、すぐに自分たちで修正することはできず、いったんDisableExplicitGCのオプションは外して再起動しました。

基本的にはGCは悪者で無くすべきものなのでしょうが、メモリの動きやGCの発生タイミングをよく観察したうえで対応しないと痛い目を見ることを学習しました。

まだ勉強中なのですが、ガベージコレクションのもととなるオブジェクトの参照には「弱い参照」という概念があるらしく、今回の事象にはどうやらこれも関係していたようです。


この記事が気に入ったらサポートをしてみませんか?