Javaはどのように動くのか~図解でわかるJVMの仕組み

第3回 システムトラブルの原因はGCの実装を知れば見えてくる

この記事を読むのに必要な時間:およそ 2 分

システムが無反応になってしまう3つの原因

  • 「システムが○○秒間無反応になっちゃって……」
  • 「システムが無反応なのに,OSのリソース使用量を見ると全然使ってないんだよね……」

JVMを使用しているシステムでは,そんな話を耳にします。なぜ,そのようなことが起こってしまうのでしょうか?

それらのおもな原因のうち,リソースに関わるものをまとめたのが表1です。

表1 無反応のおもな原因

 主な範囲無反応の主な理由
H/W, OS, M/W, JVMリソース(CPU,メモリ,ディスク,ネットワーク)不足により処理が完了するまで停滞するなど
M/Wコネクションやスレッドのプール数が足りず,割り当てられるまで待機など
JVMGCへ与えるスレッド数が足りず,CPUを使い切れていない など

原因は大きく分けて3つあります。

1つめは,リソース不足です。たとえば,CPUのクロックやコアが足りず,処理の完了待ちであることなどが原因として考えられます。

図1 CPUのリソース不足の例

図1 CPUのリソース不足の例

2つめは,M/W(ミドルウェア)からアプリケーションに提供されるスレッドや,コネクションのプールにあるリソースが不足していて,その提供待ち(無応答)になっている可能性です。

M/Wでプールしているリソースが不足した状況は,会社の書籍棚に1冊しかない本を社員で順番待ちしている状況に似ています。1冊しかないため,今借りている人が返すまでは他の人は借りれません。

図2 M/Wでプールされたリソースが不足しているケース

図2 M/Wでプールされたリソースが不足しているケース

1つめのケースで問題がGCにある場合,GCに割り当てるリソースのバランスが悪いことが原因です。たとえば,特定のプロセスに対するCPUリソースの割り当てが大きい場合,GCが起きると,CPUリソースを多く使ってしまいます。これによりCPUリソースを占有し,同じOS上で動いているほかのプロセスの動作にも影響を与えてしまい,動作が遅くなってしまうのです。

3つめは,JVMでGCの設定を誤っている(またはデフォルトのままで何もしていない)場合です。この場合,全体的なリソースは十分あるのに,GCに与えるリソースが足りていない可能性が考えられます。

図3 GCに与えるリソースが問題のケース

図3 GCに与えるリソースが問題のケース

GCの実行頻度を握るのは「生きてるオブジェクト」の量とヒープサイズ

このようなケースに対応するためは,GCの実行頻度や停止時間を考えなければなりません。そのために,GCの内部でどのように,どのような処理が行われているかを把握していきましょう。本記事では,自プロセス上のGCによる無応答状態にフォーカスして解説します。

前回⁠アプリケーション開発者がオブジェクトへの参照をすべて削除すると,JVMはGCによって不要なオブジェクトを回収し,ヒープを解放する」という仕組みを説明しました。

図4 GCによってオブジェクトを解放する(前回の図2の再掲)

図4 GCによってオブジェクトを解放する(前回の図2の再掲)

ヒープに格納されているオブジェクトのうち,アプリケーションがたどり着けるオブジェクトを「生きているオブジェクト」⁠またはLive Object)と言います。一方,たどり着けないオブジェクトを「死んだオブジェクト」⁠またはDead Object)と言います。GCが回収するのは,死んだオブジェクトです。

図5 生きてるオブジェクトと死んだオブジェクト

図5 生きてるオブジェクトと死んだオブジェクト

ヒープサイズの中で,生きているオブジェクトの割合が多い場合は,一時的に使用されるオブジェクト(すぐに死んだオブジェクトになる)を少し作ると,GCが実行されてしまいます。

図6 生きてるオブジェクトの割合が多いヒープ

図6 生きてるオブジェクトの割合が多いヒープ

そのため,GCの実行頻度を適切に設定するには,生きているオブジェクトの量とヒープサイズを検討しなければなりません。

著者プロフィール

伊藤智博(いとうちひろ)

日本オラクル(株)コンサルティングサービス統括所属。アプリケーションアーキテクトやM/Wコンサルとして,Javaに限らずさまざまな言語での開発/支援を経験。アプリ ケーションだけでなくミドルウェア,データベース,OS,ハードウェアにも興味アリ。現在,以下のコミュニティの活動に協力している。

Japan Oracle User Group(JPOUG)
Oracle LOVERS

ブログ:http://chiroito.blogspot.jp/
Twitter:@chiroito

コメント

コメントの記入