序文
今日は、ガベージコレクションにJVM 堆内存
を使用する方法と、JVM 垃圾回收器
を命令
使用してこれらのガベージコレクターを構成および使用する方法について説明します。
詳細なヒープメモリ
上の画像をすでに理解しているはずです。1つ房子
は複数房间
に分かれており、部屋ごとに機能が異なります。赤ちゃん用、両親用、祖父母用などがあります。
ヒープメモリは、
两块
1つのブロック年轻代
と他のブロックに分割されます老年代
。若い世代が分かれている
Eden
とsurvivor
。スペースサイズのデフォルトの比率は8:2です。生き残ったエリアが分かれている
s0
とs1
。これら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でロジックを書いたが、同僚はそれを直接理解できなかった
3. Tomcatをぶら下げて、Undertowのパフォーマンスは非常に爆発的です!!
4. スプリングブートは残酷です。一度に3つのバージョンをリリースしてください。
5. Spring BootはどのようにしてRedisを迅速に統合しますか?
7. Spring Boot Redisは分散ロックを実装しています。
8. 中国人は小さくて完全なJavaツールライブラリをオープンソース化しました!
9. 中国のオープンソースは非常に使いやすいRedisクライアントです。!
QRコードをスキャンして、Java Technology Stackの公式アカウントをフォローし、より多くのドライグッズを読んでください。