web-dev-qa-db-ja.com

Java Non Heap MemoryとStack Memoryの違いは何ですか?それらの違いは何でなくても同じですか?

Javaアプリケーションを監視するためにJconsoleを使用しています。[メモリ]タブには、次のような異なるヒープメモリと非ヒープメモリが表示されます。

  1. ヒープメモリ使用量
  2. ヒープ以外のメモリ使用量
  3. メモリプール「CMS Old Gen」
  4. メモリプール「Par Eden Space」
  5. メモリプール「パーサバイバースペース」
  6. メモリプール「コードキャッシュ」
  7. メモリプール「CMS Perm Gen」

これらの用語の違いは何ですか。また、これらのパラメータを監視してアプリケーションの動作の異常を見つける方法に関する情報も提供してください。

15
user2885295

すべてのCベースの言語(および他のほとんどの言語)には、基本的に3つのストレージカテゴリがあります。

  1. ヒープ
  2. スタック
  3. 静的(いくつかのバリエーションあり)

使い慣れたヒープ。

あなたもよく知っているスタックですが、あなたはそれを知らないだけです。 「ローカル」変数を持つメソッドがある場合、それらの変数は「呼び出しフレーム」に割り当てられます。 「呼び出しフレーム」は、メソッドを呼び出すときに割り当てられ、メソッドから戻るときに削除されるため、呼び出しに伴って大きくなり、戻りとともに縮小する「スタック」を使用して最も効率的に実装されます。

静的は明示的に割り当てないものであり、プログラムの実行が開始された時点から本質的に存在します。

スタックに必要なスペースは一般的にかなり小さく、上記のカテゴリの「非ヒープメモリ」にまとめられます。

11
Hot Licks

非ヒープメモリは、JVMがヒープ以外の目的で割り当てたすべてのメモリです。これも:

  • 呼び出しスタック(メモしたとおり)。
  • ネイティブコードによって割り当てられたメモリ(オフヒープキャッシュなど)。
  • hotSpot 8では、メタスペース(永続的な世代の代替)。
  • jITコンパイラが使用するメモリ(コンパイルされたネイティブコード)。

リストの「CMS Old Gen」、「Par Eden Space」、「Par Survivor Space」、および「CMS Perm Gen」はすべて、ヒープのさまざまなセクションを指します。

8
Marko Topolnik

リンク http://www.yourkit.com/docs/kb/sizes.jsp および http://publib.boulder.ibm.com/infocenter/javasdk/v5r0に従ってください。 /index.jsp?topic=%2Fcom.ibm.Java.doc.diagnostics.50%2Fdiag%2Fproblem_determination%2Faix_mem_heaps.html

非ヒープまた、JVMには非ヒープメモリと呼ばれる、ヒープ以外のメモリがあります。これは、JVMの起動時に作成され、ランタイム定数プール、フィールドとメソッドのデータ、メソッドとコンストラクターのコード、インターンされた文字列などのクラスごとの構造を格納します。

残念ながら、JVMがヒープ以外のメモリに関して提供する唯一の情報は、その全体のサイズです。非ヒープメモリの内容に関する詳細情報はありません。

非ヒープメモリサイズの異常な増加は、潜在的な問題を示している可能性があります。この場合、次のことを確認できます。

ローダーのリークなど、クラスの読み込みに関する問題がある場合。この場合、クラスローダービューを使用して問題を解決できます。大量に収容されている文字列がある場合。このような問題を検出するために、オブジェクト割り当て記録を使用できます。

1
Ahmet Karakaya