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 クラウドのアップグレードを加速

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

推薦する

Baidu と Google の外部リンクをマイニングする際に注意すべきこと

外部リンクの送り方は?リソースの発見方法は?なぜ送った外部リンクはいつも効果がないのでしょうか?それ...

時代遅れのSEOは避けましょう。SEOはそれほど単純ではありません

今日は日中何もすることがなかったので、Moonlight Blog の記事をいくつか読んで、自分がと...

市場シェア4000億、広告業界の不安をどう解決するのか?

2018年、中国のインターネット広告総額は3,694億元に達し、年間成長率は24.2%で、前年より5...

それはまるで存在しなかったかのようにゆっくりと消えていきました。

数年前、私はテクノロジー業界の大物に笑いかけました。当時彼はこう言っていた。「おそらく 1990 年...

企業がネットワークマーケティングの人材を採用できない4つの理由

想像してみてください。もし1か月間インターネットが使えなかったら、あなたはどうしますか? 多くの人が...

リベートウェブサイト上の本物のリベートと偽物のリベートの主な違いは、それが請求されるかどうかです。

最近、「福建100%商城」、「温州百葉聯盟」、「太平洋直購」などの違法ねずみ講が「リベート」の名目で...

権威あるリンクを判断する5つの基準

最近では、外部リンクを掲載するプラットフォームがますます少なくなり、高品質なコンテンツもますます少な...

SEO業界の5つの不健全な傾向をチェック

SEO というかっこいい名前は、確かに近年中国のインターネットで人気が出てきました。 Baidu の...

1 つの記事で Java の課金と代替ソリューションを理解しましょう。

[51CTO.com からのオリジナル記事] プログラミング界のリーダーである Java が、料金徴...

工業情報化部:企業のクラウドコンピューティング推進を加速し、クラウドコンピューティングセキュリティシステムを構築する

最近、中国情報通信科学院が主催し、中国通信標準化協会が後援する「OSCARクラウドコンピューティング...

お金も人もチャンネルもないのに、何万人もの人々に向けた記者会見をどうやって計画するのでしょうか?

今日は、1万人規模の記者会見がどのように企画され、記者会見後にいかに迅速に製品化されるかを見ていきま...

日本のVPSのおすすめ、厳選された日本のVPSのグループ(高速、大きな帯域幅、安い価格)

どの日本のVPSが優れていますか?どの日本のVPSが速いですか?どの日本のVPSが安いですか?一般的...

大規模なクラウド サービスの運用における 6 つの複雑な課題

企業がビジネスニーズを満たすためにアプリケーションを拡張することは珍しいことではありませんが、クラウ...