この記事の内容は、Java で JVM メモリを割り当て、管理する方法を紹介することです。 JVM のガベージ コレクション アルゴリズムと JVM のメモリ割り当てメカニズムを誰もが理解できるようにします。困っている友人は参考にしていただければ幸いです。
1. ガベージ コレクション アルゴリズム
#JVM のメモリ割り当てメカニズム
ガベージ コレクション アルゴリズムにはマークスイープがあります。 JVM は、JVM によって割り当てられたメモリ空間を再利用するために世代別コレクション アルゴリズムを使用します。世代別コレクション アルゴリズムは、主に JVM メモリ モデルのヒープ メモリを収集します。世代はコピー アルゴリズムを使用し、古い世代はマーク ソート アルゴリズムを使用します。ガベージ コレクション アルゴリズムの具体的なアイデアを見てみましょう。
マーククリア アルゴリズム:
マーククリア アルゴリズムは、マークとクリアの 2 つの段階に分かれています。最初に、再利用する必要があるメモリ領域がマークされ、その後にマークが付けられます。マーキングが完了すると、すべてのマーキングされたオブジェクトが均一にリサイクルされます。その主な理由は次の 2 つです。 1. マーキングとクリアの効率が高くありません。 2. オブジェクト空間のクリア後に大量の不連続なメモリ フラグメントが生成され、ラージ オブジェクト (大量の連続メモリを必要とするオブジェクト) を再割り当てするときにメモリ不足によりガベージ コレクションが事前にトリガーされます。そのリサイクルプロセスを下図に示します。
コピー アルゴリズムは、一度に 1 つのブロックを使用して、メモリ容量を 2 つの等しいブロックに分割します。メモリ、このメモリが使い果たされると、このメモリ内に残っているオブジェクトを別のメモリにコピーし、その後このメモリ空間をクリアして、次のオブジェクトを別のメモリ空間に割り当てます。つまり、オブジェクトが格納されています。2 つのメモリ空間は交互に使用されます。 。 JVM ヒープ メモリ内の新しい世代は、Survivor スペースから Survivor スペースまでの Eden スペースに分割されます。デフォルトの Eden と Survivor のスペース比率は 8:1 で、Eden が 80% を占め、from と to がそれぞれ 10% を占め、すべての新世代メモリが利用できるスペースは 90% です。新しい世代では、各ガベージ コレクション中に多数のオブジェクトが収集されるため、コピーする必要があるのは、生き残った少数のオブジェクトだけです。以下は、コピー アルゴリズムの動作プロセスです:
Java テクノロジ システムにおいて提唱されている自動メモリ管理は、最終的にはメモリをオブジェクトに自動的に割り当て、オブジェクトに割り当てられたメモリを再利用することに起因すると考えられます。メモリの回復については、上記のガベージ コレクション アルゴリズムを参照してください。JVM は、世代別のガベージ コレクション アルゴリズムを使用してオブジェクト メモリを回復します。新世代はコピー アルゴリズムを使用し、古い世代は古い世代を使用します。生成ではマークソートアルゴリズムが使用されます。 JVM のメモリ割り当て戦略を見てみましょう。
長期間存続するオブジェクトは古い世代に入る
仮想マシンはメモリを管理するために世代別コレクションの考え方を採用しているため、仮想マシンはどのオブジェクトを古い世代に配置する必要があるかを認識する必要があります。新しい世代とどのオブジェクトを新しい世代に配置するかを古い時代に置きます。仮想マシンは各オブジェクトに経過時間カウンターを与えます。このオブジェクトがエデン領域でマイナー GC を経験し、生存者領域に保存されている場合、このオブジェクトの年齢は 1 です。マイナー GC を生き残るたびに、オブジェクトの年齢は 1 ずつ増加します。一定レベル(デフォルトは15歳)になると旧世代に昇格します。
動的オブジェクトの経過時間の決定
さまざまなプログラムのメモリ状態に適切に適応するために、仮想マシンは、オブジェクトの経過時間に達した場合にのみオブジェクトの進入を常に許可するとは限りません。古い世代では、生存空間内の同じ年齢のオブジェクトの合計メモリが生存空間内のメモリの半分を超える場合、この年齢以上のオブジェクトが古い世代に入ります。
スペース割り当ての保証
古い世代は、新しい世代のメモリ割り当てを保証します。つまり、マイナー GC を実行する前に、仮想マシンは最初に最大連続メモリ容量を確認します。古い世代の使用可能なメモリの容量は、新しい世代のすべてのオブジェクトの合計容量以上ですか? これ以上の場合、マイナー GC は安全であることを意味します。マイナー GC、新しい世代のオブジェクトは古い世代に格納される可能性があります (マイナー GC 後に生存領域が失われる場合、メモリが十分でない場合)。この条件が true でない場合、仮想マシンは HandlePromotionFailure 設定が許可されているかどうかを確認します。許可されている場合、仮想マシンは古い世代の最大連続利用可能領域が古い世代に昇格されたオブジェクトの平均サイズより大きいかどうかを確認し、それが大きい場合は、仮想マシンは次のことを試みます。マイナー GC を実行します。保証の失敗が許可されない場合は、フル GC (旧世代 GC) が実行されて、旧世代の死んだオブジェクトのスペースが再利用され、旧世代がより多くのスペースを解放できるようになります。
以上がJavaでJVMメモリを割り当てて管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。