ガベージコレクション-GC20 +は、GCを完全に理解するのに役立ちます

前に書く:

最近、基本的な知識を整理してアイデアを明確にしました。同時に、実際のインタビューに協力したり、GCに関する架空の質問を増やしたり減らしたりして、このモジュールの知識のポイントを整理するのに役立ちます。友達。

 

GCとは?

Java言語固有のガベージコレクションメカニズム

GCでできること

ガベージコレクションのメカニズムとしての役割は、明らかにガベージオブジェクトを収集することです。主に次の3つのことを行います。

1.リサイクルする必要があるオブジェクトを決定する

2.ガベージオブジェクトをリサイクルするタイミング

3.ガベージオブジェクトをリサイクルする方法

では、GCはどのオブジェクトをリサイクルする必要があるかをどのように決定するのでしょうか?

一般的な2つの方法:参照カウント法と到達可能性分析法

これらの2つの方法に加えて、他の方法を知っていますか?

エスケープ分析

エスケープ分析について話しますか?

エスケープ分析の原則:オブジェクトの動的スコープを分析して、オブジェクトが外部参照により元の領域からエスケープするかどうかを判断します

例:

メソッドは、メソッドエスケープと呼ばれる呼び出しパラメータの形式で他のメソッドに渡されます。

オブジェクトが元のメソッドまたは元のスレッドにエスケープしないことが証明できる場合、つまり、他のメソッドがオブジェクトにアクセスできない場合は、スタックへの割り当てなど、オブジェクトに対していくつかの効率的な最適化を実行できます。スタックフレームがポップされると、オブジェクトが占有するメモリ空間が破壊される可能性があります。大量の非エスケープオブジェクトを分析できる場合、スタックフレームがポップされるとすぐに、スタックフレームによって占有されていたメモリが解放されます。これにより、GCの回復圧力が明らかに共有されます。

GC Rootsオブジェクトを理解していますか?アクセシビリティ分析について話す

到達可能性分析では、特定のオフヒープ参照オブジェクトを参照チェーンのルートノードとして使用し、分析対象のオブジェクトが参照チェーンになるまで下向きに検索します。オブジェクトの参照チェーンが0の場合、つまり、すべてのオフヒープ参照オブジェクトがこのオブジェクトを検索できない場合、オブジェクトは到達不能であり、GCによってオブジェクトをリサイクルできることを示しています。

GC Rootsオブジェクトには、JVMスタックのスタックフレームのローカル変数テーブルによって参照されるオブジェクト、ローカルメソッドスタックのJNIによって参照されるオブジェクト、メソッド領域の定数および静的プロパティ変数によって参照されるオブジェクト

ちなみに、参照カウント?

オブジェクトは、初期化され割り当てられたときにカウンターを維持します。オブジェクトが他の場所で参照されるたびに、カウンターは+1操作を実行して、オブジェクトへの現在の参照数を示します。ある時点でカウンターの値が0の場合、オブジェクトがGCによってリサイクルできることを示します

参照カウントの欠点を理解していますか?

1.まず、各オブジェクトはカウンターを維持する必要があります。オブジェクトが多い場合、カウンターの維持に使用されるオーバーヘッドが大きくなり、これは明らかに不合理です

2.アルゴリズムはオブジェクト間の循環参照の問題を処理できません

GCはどこで機能しますか?それはいつ機能しますか?

GCはヒープメモリで動作し、主にヒープメモリの若い世代(比較的頻繁)に作用し、古い世代(比較的少ない)にも作用します。メモリストレージボリュームが設定されたしきい値をトリガーするたびに、GCがトリガーされますリサイクル用

どのようなGCを知っていますか?彼らがどこで働いているのか、何をしているのか教えてください。

マイナーGC:若い世代に作用し、主にレプリケーションアルゴリズムを使用してガベージオブジェクトをリサイクルし、残っているオブジェクトをコピーして保持し、次のスペースに入ります

メジャーGC:古い時代に機能し、主にマーク削除またはマークソートアルゴリズムを使用して死んだオブジェクトをクリアします

フルGC:ヒープメモリ全体に作用し、マイナーGCが複数回トリガーされても、作成するオブジェクトの割り当てに使用できる十分なスペースがない場合にトリガーされます

 * [GC (Allocation Failure) [PSYoungGen: 1956K->501K(2560K)] 1956K->781K(9728K), 0.0024008 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [GC (Allocation Failure) [PSYoungGen: 2329K->504K(2560K)] 2609K->1327K(9728K), 0.0017602 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [GC (Allocation Failure) [PSYoungGen: 2217K->400K(2560K)] 4129K->2855K(9728K), 0.0008253 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [Full GC (Ergonomics) [PSYoungGen: 2154K->0K(2560K)] [ParOldGen: 6807K->2775K(7168K)] 8961K->2775K(9728K), [Metaspace: 3218K->3218K(1056768K)], 0.0066449 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
 * [GC (Allocation Failure) [PSYoungGen: 87K->32K(2560K)] 5038K->4983K(9728K), 0.0004724 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [GC (Allocation Failure) [PSYoungGen: 32K->32K(2560K)] 4983K->4983K(9728K), 0.0004280 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [Full GC (Allocation Failure) [PSYoungGen: 32K->0K(2560K)] [ParOldGen: 4951K->3863K(7168K)] 4983K->3863K(9728K), [Metaspace: 3222K->3222K(1056768K)], 0.0053085 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
 * [GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] 3863K->3863K(8704K), 0.0004326 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] [ParOldGen: 3863K->3843K(7168K)] 3863K->3843K(8704K), [Metaspace: 3222K->3222K(1056768K)], 0.0089908 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

あなたはレプリケーションアルゴリズムについて話し、その原理とそれがJVMでどのように実装されているかについて話しました

複製アルゴリズムの原理:

メモリを2つの領域に分割し(均等に分割されているかどうかにかかわらず、均等に分割しないことをお勧めします)、1つは(新しい)オブジェクトを生成するために使用され、もう1つは一時的に空いていて、アルゴリズムが使用されているかどうかを判断するために使用されます(HotSpot JVMは到達可能性を使用します分析)GC後にまだ生きているオブジェクトを待機スペースにコピーする

JVMでの複製アルゴリズムの実装:

2つの複製アルゴリズムがあります。最初に、オブジェクトはEden(8/10)領域で生成されます。GCの後で、残存オブジェクトはSurvivor(2/10)にコピーされ、次にSurvivorが2つの領域(1/10)に分割されます。 To(1/10)、To領域とFromここはランダムで、空の人はToで、もう一方はFromです

マークの削除とマークの並べ替えの違いは何ですか?どちらがお勧めですか?

2つの主な違いは、マークスイープアルゴリズムは、ライブオブジェクトの不均一な分布によりガベージオブジェクトをクリアした後、メモリフラグメントを生成し、リソースを浪費しますが、マークスイープアルゴリズムは、メモリフラグメントを生成し、別のメモリ領域のライブオブジェクトをソートします。一方の端、ゴミのある端のみがクリアされます。通常、タグ分類アルゴリズムを使用することをお勧めします

参考文献を理解していますか?あなたはどの参考文献を知っていますか?

参照は4つのタイプに分類されます:強参照、弱参照、弱参照、およびファントム参照

ソフトリファレンスはどこで使用できますか?

いくつかの有用であるが必要ではないオブジェクトをキャッシュして関連付けるために使用できます

GCチューニングを理解していますか?その原理について教えてください。調整したことはありますか?

原理:

ツールまたはGCログを使用してGCの実行ステータスを確認します。最も重要なことは、GCの一時停止ポイントとGCの継続時間を確認することです。これらのデータを分析および判断して、目的のパラメーター調整または構成調整を実行します。調整後、ツールまたはツールまたはログ検証調整後のGCパフォーマンス

GCログの形式を使用してGCを最適化します。最大ヒープメモリと初期ヒープを許容範囲(1/4)に等しくなるように設定します。GCをテストおよび分析するために、GCログを実行するOOMシナリオを設計しました。表示および分析

* 堆内存调优——测试发生OOM
 *
 * [GC (Allocation Failure) [PSYoungGen: 1956K->501K(2560K)] 1956K->781K(9728K), 0.0024008 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [GC (Allocation Failure) [PSYoungGen: 2329K->504K(2560K)] 2609K->1327K(9728K), 0.0017602 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [GC (Allocation Failure) [PSYoungGen: 2217K->400K(2560K)] 4129K->2855K(9728K), 0.0008253 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [Full GC (Ergonomics) [PSYoungGen: 2154K->0K(2560K)] [ParOldGen: 6807K->2775K(7168K)] 8961K->2775K(9728K), [Metaspace: 3218K->3218K(1056768K)], 0.0066449 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
 * [GC (Allocation Failure) [PSYoungGen: 87K->32K(2560K)] 5038K->4983K(9728K), 0.0004724 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [GC (Allocation Failure) [PSYoungGen: 32K->32K(2560K)] 4983K->4983K(9728K), 0.0004280 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [Full GC (Allocation Failure) [PSYoungGen: 32K->0K(2560K)] [ParOldGen: 4951K->3863K(7168K)] 4983K->3863K(9728K), [Metaspace: 3222K->3222K(1056768K)], 0.0053085 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
 * [GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] 3863K->3863K(8704K), 0.0004326 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
 * [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] [ParOldGen: 3863K->3843K(7168K)] 3863K->3843K(8704K), [Metaspace: 3222K->3222K(1056768K)], 0.0089908 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
 * Heap
 *  PSYoungGen      total 1536K, used 90K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
 *   eden space 1024K, 8% used [0x00000000ffd00000,0x00000000ffd168a8,0x00000000ffe00000)
 *   from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
 *   to   space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
 *  ParOldGen       total 7168K, used 3843K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
 *   object space 7168K, 53% used [0x00000000ff600000,0x00000000ff9c0dc8,0x00000000ffd00000)
 *  Metaspace       used 3274K, capacity 4500K, committed 4864K, reserved 1056768K
 *   class space    used 354K, capacity 388K, committed 512K, reserved 1048576K
 * Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 * 	at java.util.Arrays.copyOf(Arrays.java:3332)
 * 	at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
 * 	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:674)
 * 	at java.lang.StringBuilder.append(StringBuilder.java:208)
 * 	at com.xiaozhao.juc.JVMDemo.main(JVMDemo.java:36)
 *
 * Process finished with exit code 1

ガベージコレクターについて聞いたことがありますか?それらの実現の1つまたは2つを言うことができますか?

CMS、G1、シリアルGC、ParNew GC、パラレルGC。。。

Javaの知識の分類と学習は続いており、それは新人でしたが、それは根強いものです。それを見る友達が一緒に学んでくれることを願っています。不足がある場合は、是正してください!

おすすめ

転載: blog.csdn.net/weixin_43562937/article/details/107287382