JVM メモリ モデルの詳細な説明と JVM パラメータの詳細な構成

JVM メモリ モデルの詳細な説明と JVM パラメータの詳細な構成

JVM メモリ構造

上の図から、 JVM のメモリ空間が 3 つの部分に分かれていることが明確にわかります。

  1. ヒープメモリ
  2. 方法領域
  3. スタックメモリ

スタック メモリは、さらにJava 仮想マシン スタックとローカル メソッド スタックに分けられます。ヒープメモリは、新しい世代と古い世代に分けられます。新世代はさらに、エデン領域、From Survivor 領域、To Survivor 領域に分けられます。

1 つの部分は、Java ヒープとメソッド領域を含むスレッド間で共有されます。残りの部分はスレッド専用で、仮想マシン スタック、ネイティブ メソッド スタック、プログラム カウンターなどのメモリの小さな部分が含まれます。

ヒープ

ほとんどのアプリケーションでは、Java ヒープは Java 仮想マシンによって管理される最大のメモリ ブロックです。 Java ヒープはすべてのスレッドで共有されるメモリ領域であり、仮想マシンの起動時に作成されます。

このメモリ領域の唯一の目的はオブジェクト インスタンスを格納することであり、ほぼすべてのオブジェクト インスタンスがここにメモリを割り当てます。

ヒープ メモリはすべてのスレッドで共有され、若い世代と古い世代の 2 つの部分に分けられます。

下図の Perm は *** 世代を表していますが、*** 世代はヒープメモリの一部ではなく、JDK 1.8 以降では *** 世代は削除されていることに注意してください。

新しい世代(Young)と古い世代(Old)の比率は1:2です(この値はパラメータ-XX:NewRatioで指定できます)

デフォルトでは、Eden: from: to = 8: 1: 1 (パラメーター –XX:SurvivorRatio で設定可能)、つまり、Eden = 新世代のスペース サイズの 8/10、from = to = 新世代のスペース サイズの 1/10 です。

方法領域

この方式領域は「 第一世代」とも呼ばれます。 仮想マシンによってロードされたクラス情報、定数、静的変数を格納するために使用されます。 すべてのスレッドで共有されるメモリ領域です。

JDK8 より前の HotSpot JVM では、これらの「新しい」ものが格納される領域は「永続世代」と呼ばれます。最初の世代は連続したヒープ空間です。 JVM を起動する前に、コマンド ラインでパラメータ -XX:MaxPermSize を設定して、第 1 世代に割り当てることができるメモリ領域を設定します。 デフォルトのサイズは 64M です(64 ビット JVM のデフォルトのサイズは 85M です)。

JDK8 の登場により、JVM には 第 1 世代 (PermGen)がなくなりました。ただし、クラス メタデータはまだ存在しますが、連続したヒープ スペースに保存されるのではなく、「メタスペース」と呼ばれるネイティブ メモリに移動されます。

メソッド領域または不滅生成関連の設定

  • -XX:PermSize=64MB 最小サイズ、初期割り当て
  • -XX:MaxPermSize=256MB *** 必要に応じて割り当てられる割り当てサイズを許可します
  • XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled ガベージコレクションを実行しないように設定します
  • デフォルトサイズ
  • -serverオプションのデフォルトのMaxPermSizeは64mです。
  • -clientオプションのデフォルトのMaxPermSizeは32mです。

JVM スタック

これは 、Java メソッド実行のメモリ モデルについて説明します。 メソッドが実行されるたびに、 ローカル変数テーブル (パラメーターを含む)、操作スタック、メソッド終了、およびその他の情報を格納するための「スタック フレーム」が作成されます。各メソッドが呼び出されてから実行されるまでのプロセスは 、スタック フレームが仮想マシン スタックにプッシュされ、そこからポップされるプロセスに対応します

ネイティブスタック

ネイティブ メソッド スタックが果たす役割は、仮想マシン スタックの役割と非常に似ています。唯一の違いは、仮想マシン スタックは仮想マシンに Java メソッド (つまり、バイトコード) の実行を提供するのに対し、 ネイティブ メソッド スタックは仮想マシンが使用するネイティブ メソッドを提供するという点です。

プログラムカウンタ(PCレジスタ)

プログラム カウンターは、現在のスレッドが実行しているバイトコード ファイルの行番号を識別するインジケーターです。マルチスレッドの場合、各スレッドには独自の独立したプログラム カウンターがあるため、この領域は非スレッド共有メモリ領域になります。

Java メソッドが実行されると、カウンターにはバイトコード ファイルの行番号が格納されます。ネイティブ メソッドが実行されると、カウンターの値は空になります。

直接記憶

ダイレクト メモリは仮想マシン メモリの一部ではなく、Java 仮想マシン仕様で定義されているメモリ領域でもありません。 jdk1.4 で新しく追加された NIO は、チャネルとバッファの IO メソッドを導入します。ネイティブ メソッドを呼び出して、オフヒープ メモリを直接割り当てることができます。このオフヒープ メモリはネイティブ メモリであり、ヒープ メモリのサイズには影響しません。

JVM メモリパラメータ設定

  • -Xms は最小ヒープ サイズを設定します。
  • -Xmx はヒープ領域の最大サイズを設定します。
  • -Xmn: 若い世代のサイズを設定する
  • -XX:NewSize は、新しい世代のスペースの最小サイズを設定します。
  • -XX:MaxNewSize は、新しい世代のスペースのサイズを設定します。
  • -XX:PermSize は、第 1 世代のスペースの最小サイズを設定します。
  • -XX:MaxPermSize は生成スペースのサイズを設定します。
  • -Xssは各スレッドのスタックサイズを設定します
  • -XX:+UseParallelGC: ガベージ コレクターを並列コレクターとして選択します。この構成は若い世代にのみ有効です。つまり、上記の構成では、若い世代は並行コレクションを使用し、古い世代は引き続きシリアルコレクションを使用します。
  • -XX:ParallelGCThreads=20: 並列コレクターのスレッド数、つまり同時にガベージ コレクションを実行するスレッドの数を構成します。この値はプロセッサの数と同じになるように構成されます。

一般的な JVM パラメータ構成リファレンス:

  • java-Xmx3550m-Xms3550m-Xmn2g-Xss128k
  • -XX:並列GCスレッド=20
  • -XX:+ConcMarkSweepGC を使用-XX:+ParNewGC を使用

-Xmx3550m: JVM の最大使用可能メモリを 3550M に設定します。

-Xms3550m: JVM が 3550m のメモリを使用するように設定します。この値を -Xmx と同じに設定すると、各ガベージ コレクション後に JVM がメモリを再割り当てするのを防ぐことができます。

-Xmn2g: 若い世代のサイズを 2G に設定します。ヒープ全体のサイズ = 若い世代のサイズ + 古い世代のサイズ + 永続的な世代のサイズ。永久世代は通常 64M に固定されているため、若い世代を増やすと古い世代のサイズが減ります。この値はシステム パフォーマンスに大きな影響を与えるため、公式に推奨される構成はヒープ全体の 3/8 です。

-Xss128k: 各スレッドのスタック サイズを設定します。 JDK5.0 以降では、各スレッドのスタック サイズは 1M になり、それ以前は各スレッドのスタック サイズは 256K でした。アプリケーションのスレッド要件に基づいてメモリ サイズを調整します。同じ物理メモリの場合、この値を減らすと、より多くのスレッドが生成されます。ただし、オペレーティング システムではプロセス内のスレッド数に制限があり、これを即座に生成することはできません。経験値は3000~5000くらいです。

<<:  マイクロソフトはオープンソースを全面的にサポートし、Visual Studio と Azure DevOps クラウドのアップグレードを加速

>>:  エッジコンピューティング+クラウドコンピューティング、モノのインターネット実現の鍵

推薦する

新しい Taobao ストアのマーケティング戦略

新規にオープンしたタオバオストアが直面する最大の課題は、トラフィックがない、知名度がない、顧客基盤が...

ゲームがセキュリティ保護を通過するのは実際には難しくありません。 ! !

1. 需要背景周知のとおり、2016年11月7日、全国人民代表大会常務委員会は「中華人民共和国サイバ...

百度の4つの発表でターゲットとなった外部リンクの一覧

2012年10月、百度ウェブマスタープラットフォームは「ハイパーリンク不正行為に関するアルゴリズムの...

virmach 30%割引コードが市場に再登場、ローエンドVPS業界の価格は血まみれ、コンピュータルームを切り替える+ IPを切り替える+ Windows

低価格 VPS 業界の屠殺業者である virmach は、すでに低価格戦略を展開している中で、今月、...

ハーレムドラマ「真歓伝」の登場人物からB2Cサイトの競争について議論する

近年最も人気があったテレビ番組は、ほかでもない「真歓伝」です。テレビ画面からインターネットに広がり、...

今日、外部リンクが失敗する理由は数多くあります。

外部リンクは、オンラインプロモーションにおける強力な魔法の武器の 1 つと考えられています。強力な外...

モバイルウェブサイトの構築はますます重要になってきています

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

SEM にはどのような指示が含まれますか?

現在、インターネット上には数え切れないほどのウェブサイトがあります。趣味のために個人のウェブサイトを...

報告書によると、我が国の企業の40.3%のみがクラウドサービスを利用している。

[[229662]]接続性、コラボレーション、共有、インテリジェンスを中核特性とするエンタープライズ...

Kafka ソースコード サーバーの起動プロセスの図解

これまでの「8」回の記事では、「シナリオ主導のアプローチ」を使用して、Kafka「ログシステム」のソ...

分散アーキテクチャとクラウドネイティブを実装する方法

分散アーキテクチャとクラウドネイティブは、どちらも現在のテクノロジー分野で注目されているトピックです...

GPU仮想化技術についての簡単な説明: GPUグラフィックスレンダリング仮想化

VDI ユーザー エクスペリエンスの問題AMDのGPU SRIOVやNvidiaのM60などの直接デ...

六一クラウド:香港cn2/遼寧bgp/宿遷bgp/米国超高防御専用大帯域幅無制限トラフィック

中国商人である六易雲インターネットは、国内外のVPS、独立サーバー、CDN、DDoS高防御などの事業...