ホームページ  >  記事  >  Java  >  JavaでJVMメモリを割り当てて管理するにはどうすればよいですか?

JavaでJVMメモリを割り当てて管理するにはどうすればよいですか?

青灯夜游
青灯夜游転載
2018-10-22 17:37:443818ブラウズ

この記事の内容は、Java で JVM メモリを割り当て、管理する方法を紹介することです。 JVM のガベージ コレクション アルゴリズムと JVM のメモリ割り当てメカニズムを誰もが理解できるようにします。困っている友人は参考にしていただければ幸いです。

1. ガベージ コレクション アルゴリズム

  • #JVM のメモリ割り当てメカニズム

    ガベージ コレクション アルゴリズムにはマークスイープがあります。 JVM は、JVM によって割り当てられたメモリ空間を再利用するために世代別コレクション アルゴリズムを使用します。世代別コレクション アルゴリズムは、主に JVM メモリ モデルのヒープ メモリを収集します。世代はコピー アルゴリズムを使用し、古い世代はマーク ソート アルゴリズムを使用します。ガベージ コレクション アルゴリズムの具体的なアイデアを見てみましょう。

  • マーククリア アルゴリズム:
    マーククリア アルゴリズムは、マークとクリアの 2 つの段階に分かれています。最初に、再利用する必要があるメモリ領域がマークされ、その後にマークが付けられます。マーキングが完了すると、すべてのマーキングされたオブジェクトが均一にリサイクルされます。その主な理由は次の 2 つです。 1. マーキングとクリアの効率が高くありません。 2. オブジェクト空間のクリア後に大量の不連続なメモリ フラグメントが生成され、ラージ オブジェクト (大量の連続メモリを必要とするオブジェクト) を再割り当てするときにメモリ不足によりガベージ コレクションが事前にトリガーされます。そのリサイクルプロセスを下図に示します。

JavaでJVMメモリを割り当てて管理するにはどうすればよいですか?

  • #コピー アルゴリズム

    コピー アルゴリズムは、一度に 1 つのブロックを使用して、メモリ容量を 2 つの等しいブロックに分割します。メモリ、このメモリが使い果たされると、このメモリ内に残っているオブジェクトを別のメモリにコピーし、その後このメモリ空間をクリアして、次のオブジェクトを別のメモリ空間に割り当てます。つまり、オブジェクトが格納されています。2 つのメモリ空間は交互に使用されます。 。 JVM ヒープ メモリ内の新しい世代は、Survivor スペースから Survivor スペースまでの Eden スペースに分割されます。デフォルトの Eden と Survivor のスペース比率は 8:1 で、Eden が 80% を占め、from と to がそれぞれ 10% を占め、すべての新世代メモリが利用できるスペースは 90% です。新しい世代では、各ガベージ コレクション中に多数のオブジェクトが収集されるため、コピーする必要があるのは、生き残った少数のオブジェクトだけです。以下は、コピー アルゴリズムの動作プロセスです:

JavaでJVMメモリを割り当てて管理するにはどうすればよいですか?

    ##マーク編成アルゴリズム:
  • コピー アルゴリズムには、オブジェクト生存率が比較的高い。多数の生きているオブジェクトをコピーする必要があるため、高い設定で使用するのは簡単ではありません。さらに重要なのは、コピー アルゴリズムによりスペースが無駄に消費されることです。古い世代には比較的寿命の長いオブジェクトがいくつか保存されているため、レプリケーション アルゴリズムの使用には適していません。古い時代の特徴に従って、マークソートアルゴリズムが生み出されました。マークコンパクト アルゴリズムは、最初に生き残ったオブジェクトをマークし、次にそれらを一方の端に移動し、次に端の境界の外側のオブジェクト メモリを解放します。マーキング照合アルゴリズムの実行プロセスは次のとおりです。


JavaでJVMメモリを割り当てて管理するにはどうすればよいですか?

2. メモリ割り当てとリサイクル戦略

Java テクノロジ システムにおいて提唱されている自動メモリ管理は、最終的にはメモリをオブジェクトに自動的に割り当て、オブジェクトに割り当てられたメモリを再利用することに起因すると考えられます。メモリの回復については、上記のガベージ コレクション アルゴリズムを参照してください。JVM は、世代別のガベージ コレクション アルゴリズムを使用してオブジェクト メモリを回復します。新世代はコピー アルゴリズムを使用し、古い世代は古い世代を使用します。生成ではマークソートアルゴリズムが使用されます。 JVM のメモリ割り当て戦略を見てみましょう。

    オブジェクトは最初に Eden 領域に割り当てられます。
  • ほとんどの場合、オブジェクトは新世代の Eden 領域に割り当てられます。 Eden 領域に割り当てる十分なメモリ領域がない場合、仮想マシンはマイナー GC (New Generation GC) を開始して、生存領域に保存されていない場合、生存オブジェクトは New Generation に保存されます。十分なスペースがある場合、ストレージはスペース割り当て保証を通じて古い世代に直接デポジットされます。次に、オブジェクトをエデン領域に保管します。


  • ラージ オブジェクトは古い世代に直接入ります
  • ラージ オブジェクトとは、大量の連続メモリ領域を必要とするオブジェクトを指します。最も一般的なラージ オブジェクトは、非常に長い文字列と非常に長い配列です。 。大きなオブジェクトは、仮想マシンのメモリ割り当てにとって悪い知らせです。大きなオブジェクトが頻繁に発生すると、事前にガベージ コレクションが簡単にトリガーされ、メモリにまだ多くの領域があるときに、大きなオブジェクトを格納するための連続的な領域が生成される可能性があります。小さなオブジェクトに関する最悪の状況は、「存続期間が短い」大きなオブジェクトのグループに遭遇することですが、プログラムを作成する際にはこれを回避する必要があります。

  • 長期間存続するオブジェクトは古い世代に入る
    仮想マシンはメモリを管理するために世代別コレクションの考え方を採用しているため、仮想マシンはどのオブジェクトを古い世代に配置する必要があるかを認識する必要があります。新しい世代とどのオブジェクトを新しい世代に配置するかを古い時代に置きます。仮想マシンは各オブジェクトに経過時間カウンターを与えます。このオブジェクトがエデン領域でマイナー GC を経験し、生存者領域に保存されている場合、このオブジェクトの年齢は 1 です。マイナー GC を生き残るたびに、オブジェクトの年齢は 1 ずつ増加します。一定レベル(デフォルトは15歳)になると旧世代に昇格します。

  • 動的オブジェクトの経過時間の決定
    さまざまなプログラムのメモリ状態に適切に適応するために、仮想マシンは、オブジェクトの経過時間に達した場合にのみオブジェクトの進入を常に許可するとは限りません。古い世代では、生存空間内の同じ年齢のオブジェクトの合計メモリが生存空間内のメモリの半分を超える場合、この年齢以上のオブジェクトが古い世代に入ります。

  • スペース割り当ての保証
    古い世代は、新しい世代のメモリ割り当てを保証します。つまり、マイナー GC を実行する前に、仮想マシンは最初に最大連続メモリ容量を確認します。古い世代の使用可能なメモリの容量は、新しい世代のすべてのオブジェクトの合計容量以上ですか? これ以上の場合、マイナー GC は安全であることを意味します。マイナー GC、新しい世代のオブジェクトは古い世代に格納される可能性があります (マイナー GC 後に生存領域が失われる場合、メモリが十分でない場合)。この条件が true でない場合、仮想マシンは HandlePromotionFailure 設定が許可されているかどうかを確認します。許可されている場合、仮想マシンは古い世代の最大連続利用可能領域が古い世代に昇格されたオブジェクトの平均サイズより大きいかどうかを確認し、それが大きい場合は、仮想マシンは次のことを試みます。マイナー GC を実行します。保証の失敗が許可されない場合は、フル GC (旧世代 GC) が実行されて、旧世代の死んだオブジェクトのスペースが再利用され、旧世代がより多くのスペースを解放できるようになります。

以上がJavaでJVMメモリを割り当てて管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。