7種類のJVMガベージコレクター、いくつ知っていますか?

序文

今日は、ガベージコレクションにJVM 堆内存を使用する方法と、JVM 垃圾回收器命令使用してこれらのガベージコレクターを構成および使用する方法について説明します

詳細なヒープメモリ

上の画像をすでに理解しているはずです。1つ房子は複数房间分かれており、部屋ごとに機能が異なります。赤ちゃん用、両親用、祖父母用などがあります。

  • ヒープメモリは、两块1つのブロック年轻代と他のブロックに分割されます老年代

  • 若い世代が分かれているEdensurvivorスペースサイズのデフォルトの比率は8:2です。

  • 生き残ったエリアが分かれているs0s1これら2つのスペースはまったく同じサイズで、双子のペアであり、比率は1:1です。

ヒープメモリガベージコレクションプロセス

最初の一歩

新生成オブジェクトは最初にEdenゾーンに配置され、Edenゾーン满了が発生するとトリガーされますMinor GC

第二段階

最初のステップでは、GC内の残存オブジェクトがsurvivorエリア内のS0領域に移動します。S0領域がいっぱいになるとトリガーされMinor GCます。S0領域内の残存オブジェクトはS1領域に移動し、S0領域は解放されます。

S1がいっぱいになると、GCで残っているものがS0領域に再び移動し、S1領域が解放されます。このようにして、GCが繰り返されます。GCごとに、オブジェクトの涨一岁経過時間が特定の値(15)に達し、に入るようになります老年代

第三段階

一度発生するとMinor GC(前提条件)、Major GCガベージコレクターによっては古い世代が表示されることがあります

完全なGCトリガー条件

  • 手動でSystem.gcを呼び出すと、フルGCが継続的に実行されます

  • 老年期のスペース不足/フルスペース

  • 不十分/完全なメソッド領域

注意

次の単語を覚えておく必要がありますstop-the-worldこれは、任意のGCアルゴリズムで発生します。stop-the-worldは、JVMがGCを実行する必要があるため、停止アプリケーションの実行を意味します

ストップザワールドが発生すると、GCタスクが完了するまで、GCに必要なすべてのスレッド线程がその等待状態に入ります。多くの場合、GC最適化は、ストップ・ザ・ワールドの発生を減らすことです。

リサイクル対象となるエリア

JVM GCは再利用堆内存方法区内オブジェクトのみを処理することに注意してくださいまた栈内存、JVM内のデータは範囲外になると自動的に解放されるため、GC JVMの管理範囲内にはありません。

ヒープメモリの共通パラメーター設定

パラメータ 解説
-Xms ヒープメモリの初期サイズ、単位m、g
-Xmx ヒープメモリの最大許容サイズ。通常、物理メモリの80%以下
-XX:PermSize 非ヒープメモリの初期サイズ、一般的なアプリケーション設定は200mに初期化され、最大サイズは1024mです。
-XX:MaxPermSize 非ヒープメモリの最大許容サイズ
-XX:NewSize(-Xns) 若い世代の初期メモリサイズ
-XX:MaxNewSize(-Xmn) 若い世代の最大許容メモリサイズ
-XX:SurvivorRatio = 8 若い世代のEdenエリアとSurvivorエリアの容量の比率。デフォルトは8で、8:1です。
-Xss スタックメモリサイズ
-XX:NewRatio =旧世代/新世代 新旧世代のサイズ比を設定する
-XX:+ PrintGC jvmが開始された後、GCが検出されるたびにログが出力されます
-XX:+ PrintGCDetails 各地区の状況を含むGCの詳細情報を表示します
-XX:MaxDirectMemorySize NIOの「ダイレクトメモリ」に直接アクセスできますこれは、サイズを設定することです。設定されていない場合、デフォルトは最大ヒープスペースの値です-Xmx
-XX:+ DisableExplicitGC System.gc()を閉じます
-XX:MaxTenuringThreshold ごみは老後に入ります
-Xnoclassgc ガベージコレクションを無効にする
-XX:TLABWasteTargetPercent エデンエリア内のTLABのパーセンテージ。デフォルトは1%です。
-XX:+ CollectGen0First FullGC時にYGCが最初、デフォルトはfalse

TLABメモリ

TLABの完全な名前はThread Local Allocation Bufferです。つまり线程本地分配缓存、名前から、スレッド固有のメモリ割り当て領域であり、オブジェクトの割り当てを高速化するために生まれました。

各スレッドはTLAB(スレッドの排他的作業領域)を生成します。Java仮想マシンはこのTLAB領域を使用して、マルチスレッドの競合を回避し、オブジェクト割り当ての効率を向上させます。

TLABスペースは通常、それほど大きくありません。TLABで大きなオブジェクトを割り当てることができない場合、それらはヒープに直接割り当てられます。

パラメータ 解説
-Xx:+ UseTLAB TLABを使用する
-XX:+ TLABSize TLABサイズを設定する
-XX:TLABRefillWasteFraction TLABスペースに入る1つのオブジェクトのサイズを設定および維持します。これはスケール値であり、デフォルトは64です。つまり、オブジェクトがスペース全体の1/64より大きい場合、ヒープ内に作成されます
-XX:+ PrintTLAB TLAB情報を表示する
-Xx:ResizeTLAB 自動調整TLABRefillWasteFractionしきい値。

ガベージコレクターの概要

新世代の構成可能なコレクター:Serial、ParNew、Parallel Scavenge

古い時代に構成されたリサイクル業者:CMS、シリアルオールド、パラレルオールド

新世代のコレクターと旧世代のエリアの間の接続は、それらを一緒に使用できることを示しています。

新世代のガベージコレクター

シリアルガベージコレクター

シリアルコレクターは、最も長い開発履歴を持つ最も基本的なコレクターです。通称:ガベージコレクションに串行回收器使用复制算法

特徴

シリアルコレクターは、ガベージコレクションに単一のスレッドを使用するコレクターを指します。シリアルコレクターには、コレクションごとに1つのワーカースレッドしかありません。

並列処理が弱いシングルCPUコンピューターの場合、シリアルコレクターの集中性と排他性により、パフォーマンスが向上する傾向があります。

Stop The Worldの問題があり、ガベージコレクションの際にはプログラムを停止する必要があります。

使用し-XX:+UseSerialGC、このシリアルコレクタを使用する新世代を設定するためのパラメータを

ParNewガベージコレクター

ParNewは実際に多线程Serialのバージョンであり、マルチスレッド化を除いて、残りのパラメーターはSerialとまったく同じです。通称:ガベージコレクションに并行垃圾回收器使用复制算法

特徴

デフォルトでParNewによって開かれるスレッドの数は、CPUの数と同じです。多数のCPUコアを持つマシンでは、-XX:ParallelGCThreadsスレッド数はパラメータで設定できます

ParNewを除いて、これは古いCMSで動作できる唯一のガベージコレクタであるため、現在、新しい世代のガベージコレクタとして推奨されています。

また、Stop The World問題もある

使用-XX:+UseParNewGCこの並列コレクタを使用する新世代を設定するためのパラメータを

ParallelGCコレクター

ParallelGCはレプリケーションアルゴリズムを使用してガベージをリサイクルし、マルチスレッド化されています。

特徴

システムのスループットに非常に関心がある吞吐量= 代码运行时间/(代码运行时间+ 垃圾收集时间

-XX:MaxGCPauseMillis:最大ガベージコレクションの休止時間を設定します。あなたはGCの一時停止時間がMaxGCPauseMillisを設定することができますが、つながる減らしたい場合は、仮想マシンは、MaxGCPauseMillis範囲でGC休止時間制御に非常に小さく使用することができGC频繁、それによってGCを増やし、总时间したがって、実際の状況に応じてこの値を設定する必要があります。降低吞吐量

-Xx:GCTimeRatio:スループットサイズを設定します。これは0〜100の整数です。デフォルトでは、その値は99であり、システムは1/(1+n)ガベージコレクションに時間を費やす1/(1+99)=1%だけです。つまり、時間です。

さらに-XX:+UseAdaptiveSizePolicy、アダプティブモードオンにするよう指定することもできます。このモードでは、若い世代のサイズ、eden、from / toの比率、および古い世代に昇格したオブジェクトの年齢パラメータが自動的に調整され、ヒープサイズ、スループット、および休止時間の間のバランスポイント。

-XX:+ UseParallelGCパラメーターを使用して、この並列コレクターを使用するように新しい世代を設定します。

古い時代のガベージコレクター

SerialOldガベージコレクター

SerialOldはシリアルコレクターの老年代コレクターバージョンあり、单线程コレクターでもあります。

使用する

  • 1つは、JDK1.5以前のバージョンのParallel Scavengeコレクターと組み合わせて使用​​されます。

  • もう1つは、CMSコレクターのバックアップ計画として使用します。CMSに同時モード障害がある場合、SerialOldはバックアップコレクターとして機能します。

使用算法:マーキングソートアルゴリズム

ParallelOldGCコレクター

旧世代のParallelOldGCコレクターもマルチスレッドコレクターであり、新世代のParallelGCコレクターと同様に、スループットに重点を置いたコレクターでもあり、标记压缩算法実装に使用します。

-XX:+UseParallelOldGcコレクターを使用するように古い時代を設定する

-XX:+ParallelGCThreadsガベージコレクション中にスレッド数を設定することもできます。

CMSコレクター

CMSのフルネーム:Concurrent Mark Sweepは、彼が使用するConcurrent Mark Sweepを意味します标记清除法主にシステムの一時停止時間に焦点を当てます。

使用する-XX:+UseConcMarkSweepGCコレクタを使用して、古い世代を設定します。

-XX:ConcGCThreads同時スレッド数設定するために使用します。

特徴

CMSは排他的なコレクターではありません。つまり、CMSのリサイクルプロセスの間、アプリケーションは引き続き継続的に動作し、新しいガベージが引き続き生成されます。したがって、CMSを使用する場合は、アプリケーションのメモリが十分であることを確認する必要があります。利用可能です。

CMSは、アプリケーション饱和がゴミをリサイクルするまで待機しませんが、特定のしきい値でリサイクルを開始します。リサイクルのしきい値は、指定されたパラメーターで構成できます。-XX:CMSInitiatingoccupancyFraction指定するには、デフォルトは68、つまり使用率古い世代のスペースいつ到達するかです68%現時点では、执行CMSによってリサイクルされます。

メモリ使用量が非常に急速に増加する場合、CMSの実行中にメモリが不足しています。このとき、CMSのリサイクルは失敗し、仮想マシンは古い世代の串行コレクターを起動します。SerialOldGCガベージコレクションによりアプリケーションが起動します。中断されました。ガベージコレクションが完了するまで機能しません。

このプロセスのGC一時停止時間は長くなる可能性があるため-XX:CMSInitiatingoccupancyFraction、設定は実際の状況に基づく必要があります。

マークスイープ方式の欠点の1つは既存の内存碎片問題です。そのため、CMSには-XX:+UseCMSCompactAtFullCollecion、CMSの回復が完了した後に一度実行できるパラメーター設定があります碎片整理

-XX:CMSFullGCsBeforeCompactionパラメータは、CMSがリサイクルする回数を設定できます压缩その後、メモリが1回実行されます。

G1コレクター

長さが長すぎる(次の記事で説明します)さらに、公開番号のJavaテクノロジースタックを追跡し、jvm46と返信して、JVMチューニングガイドを取得できます。

最近の人気記事:

1. Java 8でロジックを書いたが、同僚はそれを直接理解できなかった

2. スプリングブート研究ノート、これは完成しすぎです!

3. Tomcatをぶら下げて、Undertowのパフォーマンスは非常に爆発的です!

4. スプリングブートは残酷です。一度に3つのバージョンをリリースしてください。

5. Spring BootはどのようにしてRedisを迅速に統合しますか?

6、「Java開発マニュアル(松山版)」の最新版

7. Spring Boot Redisは分散ロックを実装しています。

8. 中国人は小さくて完全なJavaツールライブラリをオープンソース化しました

9. 中国のオープンソースは非常に使いやすいRedisクライアントです。

10、同僚が隠れたバグを書いて、3日間チェックしました!

QRコードをスキャンしてJava Technology Stackの公式アカウントをフォローし、より多くのドライグッズを読んでください。

オリジナルを読むクリックして、インタビューの質問の完全なリストを取得してください

おすすめ

転載: blog.csdn.net/youanyyou/article/details/108413780