ヒープ メモリ: 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つのステップ

推薦する

シンプルな分析:ウェブサイト最適化の真の意味

ウェブサイト最適化の真の意味ウェブサイトの最適化とは、ウェブサイトの機能、ウェブサイトの構造、ウェブ...

ポストエピデミック時代にエッジコンピューティングを導入する際に企業が考慮すべきこと

感染症の拡大が続き、在宅勤務する従業員の数が増え続ける中、多くの企業が業務をエッジに移行し、データ量...

クラウドコンピューティングの未来はどうなるのか

クラウド コンピューティングはデジタル変革の重要な部分であり、企業は柔軟性と効率性を実現するためにク...

ハイブリッド クラウドのコストに関する 5 つの誤解

企業がコストを賢く計画しないと、毎月の請求書が届いたときに高額な手数料を請求される可能性があります。...

Sina が Oasis を引き継いで新しいソーシャル製品「ADA Community」を発表

10月25日、Sinaは「一緒に社交界の寵児に変身する」ことを目標に、AppStoreでひっそりと新...

3B戦争は本格化しているが、草の根SEOには言いたいことがある

8月29日早朝、360はひっそりと百度とのチェスゲームを開始した。ユーザーが360総合検索を通じて百...

メイパイと他の自撮りコミュニティの秘密の戦い:2つの自撮りコミュニティは正反対の方向へ

新浪テクノロジー 孟宏これは偶然の物語です。 2月19日、百度美牌はiOSプラットフォームで初の正式...

香港vpsの1Gbps香港CMIネットワークへのv.psアクセスの簡易評価(3つのネットワークがモバイルCMI直接接続を強制)

v.ps は一昨日、香港 cmi 回線の VPS を追加し、1Gbps の帯域幅にアクセスできるよう...

Citrix の新しい市場戦略: デスクトップ仮想化からアプリケーション仮想化へ

[51CTO.com からのオリジナル記事] Citrix について言及すると、多くのユーザーはデス...

ウェブサイトの記事の読み込み速度を向上させるいくつかの方法

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますウェブサイ...

123systems-50ドル/Xen/4コア/2gメモリ/50gハードディスク/3Tトラフィック/ダラス

123systems、1 月のプロモーション、XEN.PV ベースの VPS の年間価格は非常に低く...

サイト降格につながる7つの死刑執行人の簡単な分析

サイトの降格は、多くの最適化担当者が遭遇する問題です。分析すると、サイトが降格される可能性があること...

クラウド移行の3つの間違いを避ける方法

今日、ほとんどのエンタープライズ IT 組織にとって、ワークロードをパブリック クラウドに移行するこ...

V5Net: 香港サーバー 30% オフ、625 元、2*e5-2630L/32g メモリ/1TSSD/10M 帯域幅 (CN2+BGP)

V5 Server (V5Net) は現在、香港独立サーバー向けの特別プロモーションを実施しており、...