ヒープ メモリ: Java プログラムの「宝物」、そこに何が隠されているかご存知ですか?

ヒープ メモリ: Java プログラムの「宝物」、そこに何が隠されているかご存知ですか?

みなさんこんにちは。私はテクノロジーの共有が大好きなプログラマーの Xiaomi です。今日は、Java ヒープメモリの分割とリサイクルのアルゴリズムについてお話したいと思います。

ヒープメモリとは

  • 意味: Java 仮想マシンによって管理され、オブジェクト インスタンスを格納するために使用されるメモリ領域です。 Java のすべてのオブジェクト インスタンスはヒープ メモリ内に割り当てられ、リサイクルされます。
  • 価値: ヒープ メモリはメモリ領域を動的に割り当てることができるため、プログラムに柔軟なデータ保存方法を提供します。同時に、Java 仮想マシンの自動ガベージ コレクション メカニズムにより、ヒープ メモリはより便利で安全なメモリ管理方法も提供します。
  • ストレージデータ: 主にさまざまな Java オブジェクトと配列が含まれます。 Java では、 new キーワードを使用して、新しいオブジェクト インスタンスをヒープ メモリに割り当てることができます。
  • 関連コマンド: ヒープ メモリ サイズを設定するコマンドは -Xmx です。たとえば、java -Xmx512m コマンドを使用してヒープ メモリ サイズを 512 MB に設定できます。

ヒープメモリ空間を分割する方法

Java ヒープ メモリは、経過時間やサイズなどの要素に基づいて分割できます。 Java ヒープ メモリは、年齢に基づいて、若い世代と古い世代の 2 つの部分に分けられます。

新しい世代は、Eden エリア、Survivor エリア From、Survivor エリア To の 3 つの部分に分けられます。このうち、Eden 領域は新しく生成されたオブジェクトを格納するために使用され、Survivor 領域 From と Survivor 領域 To は Eden 領域で生き残ったオブジェクトを格納するために使用されます。

デフォルトでは、新世代と旧世代の比率は 1:2 です。つまり、新世代は Java ヒープ メモリ全体の 1/3 を占め、旧世代は 2/3 を占めます。新世代では、Eden 領域と Survivor 領域の比率は 8:1:1 です。つまり、Eden 領域が新世代全体の 80% を占め、Survivor 領域 From と Survivor 領域 To がそれぞれ新世代全体の 10% を占めます。

これら 2 つの比率は、新世代と旧世代のメモリ使用量を考慮して設定されます。新しい世代の割合が小さすぎると、ガベージコレクションが頻繁に発生する可能性があり、古い世代の割合が大きすぎると、メモリの無駄が発生する可能性があります。

-Xmn コマンドを設定することで新しい世代のサイズを調整でき、-XX:NewRatio コマンドを使用して新しい世代と古い世代の比率を調整できます。

永久世代が削除されたのはなぜですか?

JDK1.8 より前では、Java 仮想マシンは永続的な世代を使用して、一部の静的データとクラス情報を保存していました。しかし、永続世代のメモリ使用量とガベージ コレクションの効率は理想的ではないため、永続世代は JDK1.8 で削除され、Metaspace に置き換えられました。

メタスペースは、クラス構造情報、フィールド、メソッド情報などを含むクラス メタデータが格納される Java 仮想マシン内の領域です。メタスペースのサイズは動的に調整でき、さらに多くのクラス メタデータを保存する必要がある場合は、メタスペースを自動的に拡張できます。

永続世代と比較して、メタスペースのメモリ使用量とガベージコレクションの効率が大幅に向上しました。同時に、メタスペースは永久世代のサイズによって制限されなくなったため、さまざまなアプリケーション シナリオに適応しやすくなります。

メタスペースのサイズを設定するコマンドは -XX:MaxMetaspaceSize です。

マークスイープ

Java ヒープ メモリ内のオブジェクト インスタンスは動的に割り当てられ、再利用されます。 Java 仮想マシンは、さまざまなメモリ管理要件を満たすために、さまざまなメモリ再利用アルゴリズムを提供します。

マークスイープアルゴリズムは、最も基本的なメモリリサイクルアルゴリズムです。主なプロセスは次のとおりです。

  • すべてのアクティブなオブジェクトをマークします。
  • マークされていないオブジェクトをすべてクリアします。

このアルゴリズムの欠点は、メモリの断片化を引き起こし、メモリの使用率が低下することです。

コピーアルゴリズム

レプリケーション アルゴリズムはメモリを 2 つの部分に分割し、一度に 1 つの部分のみを使用します。このメモリ部分が使い果たされると、その中のアクティブなオブジェクトは別の部分にコピーされ、その後このメモリ部分はクリアされます。

コピー アルゴリズムの利点は、メモリの断片化を回避できることです。欠点は、追加のメモリ領域を消費することです。

レプリケーション アルゴリズムは、主に新世代のメモリ回復に使用されます。

マークコンパクト

マークスイープ アルゴリズムはメモリを 2 つの部分に分割します。1 つの部分にはアクティブなオブジェクトが格納され、もう 1 つの部分には未使用のメモリ領域が確保されます。メモリ領域が不足している場合は、まずアクティブなオブジェクトがマークされ、次にアクティブなオブジェクトが未使用のメモリ領域に分類され、最後に未使用のメモリ領域がクリアされます。

マークスイープ アルゴリズムはメモリの断片化を回避できますが、メモリ内でオブジェクトを移動する必要があるため、効率が低いという欠点があります。

マークスイープアルゴリズムは、主に古い世代のメモリ回復に使用されます。

世代リサイクルアルゴリズム

世代別リサイクル アルゴリズムは、オブジェクトのライフ サイクルに応じてメモリを異なる世代に分割し、各世代で異なるメモリ リサイクル アルゴリズムを使用します。

新しい世代では、レプリケーション アルゴリズムが一般的に使用されます。新しい世代のほとんどのオブジェクトのライフサイクルは非常に短いため、このアルゴリズムはより効率的です。マークスイープアルゴリズムは、古い世代では一般的に使用されます。古い世代に保存されているオブジェクトのライフサイクルは長いため、このアルゴリズムによりガベージコレクションの回数を効果的に減らし、Java アプリケーションのパフォーマンスを向上させることができます。

G1アルゴリズム

G1 アルゴリズムは、サーバー側アプリケーション用のガベージ コレクション アルゴリズムです。ヒープ メモリを同じサイズの複数の領域に分割します。各領域は新しい世代または古い世代のいずれかになります。 G1 アルゴリズムは、アプリケーションのメモリ使用量に基づいて各領域のサイズを動的に調整します。

G1 アルゴリズムでは、ガベージ コレクターは新しい世代と古い世代の区分に従ってガベージ コレクションを実行するのではなく、ヒープ領域全体をまとめて考慮します。 G1 アルゴリズムは、世代リサイクル アルゴリズムに似た考え方を使用して、ヒープ スペースを複数の領域に分割します。各領域のリサイクル戦略は異なるため、より柔軟なメモリのリサイクルが可能になります。

G1 アルゴリズムの利点は、ガベージ コレクションの効率を確保しながら、メモリの断片化の問題を回避できることです。同時に、G1 アルゴリズムは各領域のサイズを動的に調整できるため、さまざまなアプリケーション シナリオに適応しやすくなります。

要約すると、Java 仮想マシンはさまざまなメモリ回復アルゴリズムを提供しており、それぞれに独自の利点、欠点、適用可能なシナリオがあります。実際のアプリケーションでは、メモリ リソースの使用を最大化し、アプリケーションのパフォーマンスを向上させるために、特定のアプリケーション シナリオに基づいて適切なガベージ コレクション アルゴリズムを選択する必要があります。

要約する

この記事では、Java 仮想マシンのヒープ メモリのパーティションとリサイクル アルゴリズムについて詳しく説明します。ヒープ メモリは、オブジェクトを格納するために使用される Java 仮想マシン内のメモリ領域です。 Java プログラム内のすべての新しいオブジェクトはヒープ メモリに格納されます。メモリ リソースをより効率的に利用するために、Java 仮想マシンはヒープ メモリを新しい世代と古い世代に分割し、異なるメモリ領域に対して異なるガベージ コレクション アルゴリズムを使用します。

新世代のガベージ コレクション アルゴリズムには、主に Serial、ParNew、G1 アルゴリズムが含まれます。シリアル アルゴリズムは最も基本的なガベージ コレクション アルゴリズムであり、ガベージ コレクションに単一のスレッドを使用します。 ParNew アルゴリズムは、Serial アルゴリズムのマルチスレッド バージョンです。ハードウェア リソースをより有効に活用し、マルチコア CPU でのガベージ コレクションの効率を向上させることができます。 G1 アルゴリズムは、さまざまなアプリケーション シナリオに適応できるサーバー側アプリケーション用のガベージ コレクション アルゴリズムです。

旧世代のガベージ コレクション アルゴリズムには、主に CMS アルゴリズムと G1 アルゴリズムが含まれます。 CMS アルゴリズムは、マークスイープ アルゴリズムに基づいたガベージ コレクション アルゴリズムです。ガベージコレクションにマルチスレッドを使用しますが、断片化の問題があります。 G1 アルゴリズムは、メモリの断片化の問題を回避できる、より柔軟なガベージ コレクション アルゴリズムです。

実際のアプリケーションでは、特定のアプリケーション シナリオに基づいて適切なガベージ コレクション アルゴリズムを選択する必要があります。同時に、ガベージ コレクションはアプリケーションのパフォーマンスに影響を与えることにも注意する必要があります。ガベージ コレクションが過度に頻繁に実行されると、アプリケーションのパフォーマンスが低下する可能性があります。したがって、Java アプリケーションを設計および開発する際には、アプリケーションのパフォーマンスと安定性を向上させるために、実際の状況に応じてメモリ空間のサイズとガベージ コレクション アルゴリズムの選択を合理的に設定する必要があります。

<<:  サードパーティのウェアハウスで Zadig パイプラインの自動トリガーを実現する方法

>>:  クラウド移行を成功させるための8つのステップ

推薦する

openitc-$6.7/8コアCPU/1gメモリ/13g SSD/42Tトラフィック

2008 年に設立され、英国に登録されている openitc (サブブランド XenVZ もあります...

hostsolutions: ルーマニア VPS、DMCA フリー、年間 76 ユーロ、KVM、3.6T ハードディスク、10T トラフィック

Hostsolutions の社長が戻ってきました (体調不良だそうです)。プロモーション用に 50...

金群宝:核分裂成長の究極の秘密、あなたが知らない交通の背後にあるロジックを明らかにする

月収10万元の起業の夢を実現するミニプログラム起業支援プランWeChatインターネットはトラフィック...

エッジコンピューティングの未来: モバイル通信会社、小売、銀行、金融サービス

私たちは、エッジ コンピューティングというコンピューティングの新しい時代にいます。これまでのあらゆる...

regolithmedia - 48 台のコンピュータ ルーム/KVM 仮想 VPS/香港\シンガポール\インドネシア\オーストラリア

インドネシアで正式に登録された会社である regolithmedia は、2009 年に設立され、7...

行き詰まりを打破: F5 はどのようにして究極のアプリケーション保護、配信、最適化を実現するのでしょうか?

「 7年前に私がF5に入社することを決めたときを振り返ると、顧客やパートナーはそれを無謀な決断だと思...

4月上旬の国内ウェブサイトトラフィック:360 Security CenterがTaobaoを上回り3位に

IDC Review Network (idcps.com) は 4 月 29 日に次のように報告し...

ネットセレブ競争の後半戦:トラフィック獲得と突破への不安

人気アーティストになるための道が再編されつつある。番組から登場した新人に加え、ショート動画の有名人も...

クラウドに乗って、デュアルリアル企業レノボの変革プロセスを見る

レノボグループ自体は、研究、生産、供給、販売、サービスの全バリューチェーンにおいて多くの実践を行って...

Baidu最適化の8つの重要なポイントについて簡単に説明します

最近、Baiduの計算ルールは大きく変更され、多くのSEO担当者を不安にさせていると言えます。しかし...

alchosting: フィリピン VPS、月額 15.99 ドル、1G メモリ/1 コア/50g NVMe/5T トラフィック/1Gbps 帯域幅

フィリピンの会社である Alchosting LLC は 2009 年に設立され、主に VPS、仮想...

中泰証券はアリババクラウドヤオチデータベースを導入し、コア業務システムの自主革新を完了し、マイクロ秒レベルの業務応答を実現

中国の大手証券会社である中泰証券株式会社(以下、中泰証券)は5月23日、自社構築のシステムをアリババ...

タオバオの公式デザイン変更がリーク、今月末までに完了する可能性

10月25日、ある商人が易邦電力網に明らかにしたところによると、タオバオは昨日から改訂された新ホーム...

自動車ブランドの若者向けマーケティング

若さとファッション性が自動車ブランドの戦略的焦点と市場刺激ポイントになりつつあります。若者向けにどう...