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

推薦する

人材募集のWeChatビジネスモデルが知識報酬や教育業界で人気になったのはなぜでしょうか?

人々の心にある教育のイメージは、しばしば真面目なものですが、トラフィックの欲求により、人材募集のWe...

アメリカの配車サービスであるUberは、どのようにして4年間で時価総額を180億ドルにまで成長させたのでしょうか?

海外メディアの報道によると、アメリカの配車サービス「ウーバー」の評価額はわずか4年でゼロから驚異の1...

4月第3週の国内ドメイン名解決プロバイダートップ10:HiChinaが20.32%に上昇

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

openitc UK 1G KVM 6.5ドル/月

おすすめのイギリスのVPSはopenitc.co.ukです(この会社は2008年にイギリスで登録され...

中小企業のリーダーはSEOをどう捉えるべきか

SEOの重要性を認識するビジネスリーダーが増えているようです。彼らはプロのSEO会社に相談したり、従...

病院のウェブサイト構築と最適化に関する経験を共有しましょう

最適化の仕事に携わってきたこの数年間、私はあまりにも多くの業界と接してきました。その中でも、医療業界...

モバイル向けに最適化されたウェブサイトに関する Google の推奨事項

近年のスマートフォンの普及により、モバイルデバイス経由でウェブサイトを閲覧するユーザーが増えており、...

草の根ウェブマスターがビジネスを始めるときに注意すべきことは何ですか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスインターネットが発展して...

ウールとギャング:インターネット クラウドソーシングをファッションに導入

「編み物」といえば、多くの人は次のような光景を思い浮かべるでしょう。庭のロッキングチェアに座り、老眼...

DMIT: 日本 cn2 gia vps (100M 帯域幅)、ハイエンド高速ネットワーク、50% 割引、年間 197 ドルから

DMIT は現在、日本の東京データセンターのプレミアム シリーズ VPS を 50% 割引で提供して...

商標登録ウェブサイトの内部と外部の改善のための最適化戦略

完璧な女性はただ美しい外見を持っているだけではないことは誰もが知っています。もっと大切なのは内面の美...

SEOERがウェブサイトの重量を改善するためのいくつかの方法を実践的に共有

ほとんどの SEO 担当者は、ウェブサイトの重量を改善する方法を知りません。私は個人的に、フォーラム...

Red Hat、クラウドアプリケーションの開発と配信を効率化する機能を拡張

オープンソース ソリューションの世界的な大手プロバイダーである Red Hat は本日、Red Ha...

2018年にはクラウド導入が96%に急上昇し、ITガバナンスが重要になる

現在、企業の 81% がマルチクラウド環境で運用しており、26% がパブリック クラウド インフラス...