GCは、ユーザスレッドを一時停止するのはなぜ?どのような非難は何心配?
序文
記事JVMの最初のシリーズ。フォローアップのためにご期待。
障害の説明
午前中に特定の日に、回線障害は、調査の後、コアサービスはダボタイムアウトをインタフェースすることがわかりました。
根本的な原因
指標の監視サービスをチェックし、私たちはあまりにも頻繁にサービスFullGCの数は、単に神であることをことを見出しました。これは、インターフェイスがタイムアウトされるのも不思議ではありません。
なぜFullGCあまりにも多くの時間がそれからインターフェース回を起こすのだろうか?
GCが一時停止しますので。FullGCはGCが一時停止され、また、STOPで世界を呼ばれたときに発生します。STWと呼ばれる、ユーザ・スレッドが中断され、ガベージコレクションアルゴリズムの実装を指します。これは、頻繁な原因FullGCサービスがタイムアウト理由を理解することは難しいことではありません。
深さ探査
では、なぜ頻繁にFullGCそれは原因?
この質問に答える前に、フルGCをトリガーするどのような状況の下で理解するには?
- 旧のメモリ容量が不足している、それはFullGCがトリガされます。
- 永久/メタスペースのメモリ空間の不十分な世代は、FullGCがトリガされます。
- ディスプレイコールGC、にSystem.gc()。(私はJVMのGCをお勧めしますが、必ずしもそうではないでしょうGC)。
トップ3のFullGCのための基本的な理由。
オブジェクトはトラブルフリーのサービスの多くを作成することで、メモリ不足が生じ、リサイクルすることができない、とGCが回復できないときに、それは頻繁にFullGCが発生します。
定期的な失敗
メモリ不足がFullGCの原則原因に基づいてオブジェクトを作成するには、デモが書いた、GCは、状況を観察します。
コードは以下の通りであります:
コードは、非常に単純で、最後に回収することができる作成されたオブジェクトを作ることです、そして、それが回収されることはありませんルートにリンクし、オブジェクトを作成し続け、そして。デモ住所
使用スタートアップパラメータ-Xms512m -Xmx512mヒープメモリサイズを設定します。
スタートデモは、その後、GCの条件を遵守するための要求を開始します。
まず、コマンドJPSは、プロセスIDを確認するには、-lを使用します
次いで、(ビュー情報GCにJSTATコマンドを使用JSTATコマンドは、詳細):
図は、ノンストップのフルGCを実行している見ることができます。
図は、古い時代、見ることができるだけでなく、メタデータ領域メモリがいっぱいになる、これはGC完全停止の理由です。
発行した私の要求を見てください:
そう長くのために過去には、まだ何もありません。
スレッドの状態を表示するために使用jstackコマンドは、ユーザースレッドが中断されたことがわかりました。
頻繁にFullGCは、アプリケーションの正常な動作に影響を与えている見ることが難しいことではありません。
結論
JVMはまだ非常に必要である学びます。問題はそう簡単ではその上に来る何を考えていないカード。