Java 言語と C 言語の最大の違いは、自動メモリ リサイクルであることは誰もが知っています。では、JVM はメモリ リサイクルをどのように制御するのでしょうか? この記事では、メモリ リサイクルの基本原理を理解するために、JVM ガベージ コレクションのアルゴリズムをいくつか紹介します。
stop the world
ガベージ コレクション アルゴリズムを紹介する前に、ガベージ コレクション アルゴリズムを実行する際に stop the world が生成されるという言葉をまず理解する必要があります。コレクション ( JVM ) は Java アプリケーションを一時的に実行し、ガベージ コレクションが完了した後も実行を継続します。 JMeter を使用して Java プログラムをテストしたことがある場合は、テスト中に Java プログラムが不規則に一時停止することに気づくかもしれません。実際、これは一時停止中に JVM がガベージ コレクションを実行していることを意味します。したがって、世界を停止する時間を可能な限り短縮することが、JVM を最適化する際の主な目標です。次に、現在利用可能な一般的なガベージ コレクション アルゴリズムを見てみましょう。
参照カウント方法
参照カウント方法は、その名の通り、オブジェクトが参照された回数をカウントします。参照カウントが増加すると1が加算され、参照カウントが減少すると1がカウントされます。が差し引かれます。
上の図は、3 つの Teacher 参照がヒープ内の Teacher オブジェクトを指しており、Teacher オブジェクトの参照カウントは 3 であり、類推により Student オブジェクトの参照カウントは 2 であることを示しています。 。
上の図は、Teacher オブジェクトの参照が 2 に削減され、Student オブジェクトの参照が 0 に削減されることを示しています(削減の理由は、参照が参照カウント アルゴリズムに従って、Student オブジェクトのメモリ領域が再利用されます。
参照カウント アルゴリズムの原理は非常に単純で、最も原始的なリサイクル アルゴリズムですが、1. 頻繁なカウントはパフォーマンスに影響を与える、2. 問題に対処できないという 2 つの理由から、このアルゴリズムは Java では使用されません。循環参照の。
たとえば、Teacher オブジェクトは Student オブジェクトを参照し、Student オブジェクトは Teacher オブジェクトを参照します。この場合、オブジェクトは決してリサイクルされません。
マークのクリア
マークのクリア アルゴリズム。これは、多くのガベージ コレクション アルゴリズムの基礎です。簡単に言えば、マークとクリアの 2 つのステップがあります。
マーク: すべての GC ルートを走査し、GC ルートから到達可能なオブジェクトをライブ オブジェクトとして設定します。
クリア: ヒープ内のすべてのオブジェクトを走査し、到達可能としてマークされていないオブジェクトをクリアします。
上の図の灰色のオブジェクトに注意してください。これらは GC ルートからトラバースできないため (オブジェクト自体には参照関係がありますが、GC ルートからトラバースできないため)、生きているオブジェクトとしてマークされません。クリーンアッププロセス中にリサイクルされます。ここで注意する必要があるのは、マークおよびクリア アルゴリズムの実行中に「ストップ ザ ワールド」が発生し、マーク中に新しいオブジェクトが生成されないように Java プログラムが一時停止して待機できることです。そして明確なプロセス。 Java プログラムを一時停止する必要があるのはなぜですか?たとえば、マーキング プロセスの完了後に新しいオブジェクトが生成され、そのオブジェクトがマーキング期間を過ぎた場合、その後のクリーンアップ プロセスでは、新しく生成されたオブジェクトはマークされていないため、マークされていないものとみなされます。到達不可能なオブジェクトがクリアされると、プログラムはエラーになります。そのため、マーククリアアルゴリズムが実行されると、Java プログラムは一時停止され、「世界を止めてください」という結果になります。
次に、マークとクリアのアルゴリズムをまとめてみましょう:
1. 多くのメモリ走査作業が含まれるため、実行パフォーマンスが低く、「世界を停止する」時間が長くなります。 Java プログラムのスループットの低下
2. オブジェクトがクリアされた後、クリアされたオブジェクトがメモリ内に空き位置を残し、メモリの不連続性とスペースの無駄を引き起こすことに気付きました。
次に、他のアルゴリズムでこれらの問題を改善できるかどうか見てみましょう?
タグ圧縮
マーク圧縮アルゴリズムを思い浮かべたかもしれませんが、これはマーク除去アルゴリズムに基づいて圧縮プロセスを追加したものです。
マークアンドクリアが完了すると、メモリ空間が圧縮されてメモリ空間が節約され、マークアンドクリアアルゴリズムにおけるメモリの不連続の問題が解決されます。
マーク圧縮アルゴリズムは「ストップ・ザ・ワールド」も生成するため、Java プログラムと同時に実行できないことに注意してください。圧縮プロセス中に、一部のオブジェクトのメモリ アドレスが変更されるため、Java プログラムは圧縮が完了するまで待ってから続行できます。
コピーアルゴリズム
コピーアルゴリズムは単にメモリを 2 つに分割しますが、ガベージコレクション中に、使用されているメモリ内に残っているオブジェクトがもう一方の空のメモリにコピーされます。最後に、ガベージ コレクションを完了するために使用されているメモリ領域内のオブジェクトをクリアします。
レプリケーション アルゴリズムはマーク圧縮アルゴリズムよりも簡潔で効率的ですが、欠点は次のとおりです。当然のことですが、コピーする必要があるオブジェクトが多く、コピーのパフォーマンスが低いため、多くのオブジェクトが残っている状況には適していません。そのため、コピー アルゴリズムは、新しい世代のガベージ コレクションによく使用されます。新しい世代では生き残るオブジェクトが少なくなり、コピーコストが低くなるため、メモリ空間が節約されます。もう 1 つの欠点は、メモリ空間占有コストが高いことです。これは、2 つのメモリ空間に基づいてオブジェクトをコピーし、非ガベージ コレクション サイクル中に 1 つのメモリ空間しか使用しないため、メモリ使用率が低くなります。
概要
上記で一般的なガベージコレクションアルゴリズムを紹介しましたが、それぞれのアルゴリズムには独自の利点と欠点があります。ただし、JVMでは、単に特定のアルゴリズムを使用するのではなく、ガベージコレクションと呼ばれる方法を使用します。ガベージ コレクターに関しては、ガベージ コレクターは、さまざまなシナリオで適切なガベージ コレクターを使用することによってのみ、半分の労力で 2 倍の結果を得ることができます。次回の記事ではガベージコレクターについて紹介します。
参考資料:
「実践Java仮想マシン」Ge Yiming
「Java仮想マシンの徹底理解(第2版)」Zhou Zhiming
以上がJVMガベージコレクションアルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。