web-dev-qa-db-ja.com

Javaメモリプールはどのように分割されますか?

現在、jconsoleでJavaアプリケーションを監視しています。 [メモリ]タブでは、次のいずれかを選択できます。

Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”

それらの違いは何ですか?

210
Dani Cricco

ヒープメモリ

ヒープメモリは、Java VMがすべてのクラスインスタンスおよび配列にメモリを割り当てるランタイムデータ領域です。ヒープは固定サイズでも可変サイズでもかまいません。ガベージコレクターは、オブジェクトのヒープメモリを再利用する自動メモリ管理システムです。

  • Eden Space:ほとんどのオブジェクトにメモリが最初に割り当てられるプール。

  • Survivor Space:Edenスペースのガベージコレクションを生き残ったオブジェクトを含むプール。

  • Tenured GenerationまたはOld Gen:存在するオブジェクトを含むプールサバイバー空間でしばらくの間。

ヒープ以外のメモリ

非ヒープメモリには、すべてのスレッドで共有されるメソッド領域と、Java VMの内部処理または最適化に必要なメモリが含まれます。ランタイム定数プール、フィールドおよびメソッドデータ、メソッドおよびコンストラクターのコードなどのクラスごとの構造を格納します。メソッド領域は論理的にヒープの一部ですが、実装によっては、Java VMがガベージコレクションまたはヒープを圧縮しない場合があります。ヒープメモリと同様に、メソッド領域は固定サイズでも可変サイズでもかまいません。メソッド領域のメモリは連続している必要はありません。

  • 永続的な生成:クラスやメソッドオブジェクトなど、仮想マシン自体のすべてのリフレクトデータを含むプール。クラスデータ共有を使用するJava VMでは、この世代は読み取り専用領域と読み取り/書き込み領域に分割されます。

  • コードキャッシュ:HotSpot Java VMには、コンパイルに使用されるメモリを含むコードキャッシュも含まれます。ネイティブコードの保存。

Jconsoleの使用方法に関するドキュメントがあります

312
dfa

新しいキーワードは、Javaヒープにメモリを割り当てます。ヒープはメモリのメインプールであり、アプリケーション全体にアクセスできます。そのオブジェクトに割り当てるのに十分なメモリがない場合、JVMはガベージコレクションを使用してヒープからメモリを回収しようとします。それでも十分なメモリを取得できない場合、OutOfMemoryErrorがスローされ、JVMは終了します。

ヒープは、世代と呼ばれるいくつかの異なるセクションに分割されます。オブジェクトのガベージコレクションが増えると、オブジェクトは異なる世代に昇格します。古い世代は頻繁にガベージコレクションされません。これらのオブジェクトは長寿命であることがすでに証明されているため、ガベージコレクションされる可能性は低くなります。

オブジェクトが最初に構築されるとき、それらはEden Spaceに割り当てられます。ガベージコレクションを生き延びた場合、サバイバースペースに昇格し、そこで十分に長く生きた場合、Tenured Generationに割り当てられます。この世代は、ガベージコレクションの頻度がはるかに低くなります。

Permanent GenerationまたはPermGenと呼ばれる第4世代もあります。ここに存在するオブジェクトはガベージコレクションの対象ではなく、通常、クラス定義や文字列定数プールなど、JVMの実行に必要な不変の状態が含まれています。 PermGenスペースはJava 8から削除される予定であり、ネイティブメモリに保持されるMetaspaceと呼ばれる新しいスペースに置き換えられることに注意してください。参照: http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

enter image description hereenter image description here

57
Pythoner

Java8では、非ヒープ領域にPermGenが含まれなくなりましたが、メタスペースはJava8の主要な変更であり、Javaでメモリ不足エラーを取り除くことになっています。メタスペースのサイズは、クラスデータのjvm。

33
user2767149

Javaヒープメモリは、オペレーティングシステムによってJVMに割り当てられたメモリの一部です。

オブジェクトは、ヒープと呼ばれる領域に存在します。ヒープはJVMの起動時に作成され、アプリケーションの実行中にサイズが増減する場合があります。ヒープがいっぱいになると、ガベージが収集されます。

enter image description here

Eden Space、Survivor Space、Tenured Space、およびPermanent Generationの詳細については、SEの質問をご覧ください。

若い、TenuredおよびPermの生成

Java 8リリース以降、PermGenはMetaspaceに置き換えられました。

クエリについて:

  1. Eden Space、Survivor Space、Tenured Spaceはヒープメモリの一部です
  2. メタスペースとコードキャッシュは、非ヒープメモリの一部です。

Codecache:Java Virtual Machine(JVM)はネイティブコードを生成し、コードキャッシュと呼ばれるメモリ領域に保存します。 JVMは、動的に生成されたインタープリターループ、Java Native Interface(JNI)スタブ、およびネイティブコードにコンパイルされるJavaメソッドなど、さまざまな理由でネイティブコードを生成します。ジャストインタイム(JIT)コンパイラ。 JITは、コードキャッシュの最大のユーザーです。

18
Ravindra babu