Javaのメモリ領域 - Java仮想マシン(A)の深い理解

Javaのメモリ領域を理解します

プログラムカウンタは、仮想マシン、ネイティブメソッドスタック、ヒープ、メソッド領域をスタック:メモリ領域を合計するJavaプログラムの動作中にJava仮想マシンであって、メモリデータを複数に分割されています。各メモリデータ領域の特徴、特性が変わります。

1.プログラムカウンタ

1.1プログラムカウンタ理解

プログラムカウンタは、スレッドプライベートに属する、小さなメモリフットプリント領域であり、それは、行番号指示子バイトコードの実行として見ることができます。

プログラムカウンタ1.2の役割

●バイトコードインタプリタの作業は、プログラムカウンタの値を変更することによって実行される次のバイトコード命令を取得することです。

●各スレッドは、独自のカウンタを持つようにスレッドコンテキストスイッチは、スレッドで実現することができるときに、プログラムカウンタスレッドのプライベートは、所属する実行カウンタの値が保存されて再開します。

1.3プログラムカウンタ機能

●スレッドプライベートと小さなメモリフットプリント。

●Javaのメモリ領域にのみ表示されない領域のOutOfMemoryErrorがあります。

●Javaスレッド実行方法格納されたバイトコード命令アドレスカウンタと、ネイティブメソッドが実行され、カウンタの値がヌルです。

2. VMスタック

2.1仮想マシンおよびスタックの役割を理解します

VMスタックは、専用スレッド、ライフサイクルとスレッドの一貫性を属します。仮想マシンのスタックのJavaメモリ・モデルは、記載された方法を行う:各メソッドが実行された場合、Java仮想マシンは、情報、オペランドスタック、動的リンク、方法輸出を格納するため、ローカル変数テーブルをスタックフレームをスタック生成します。Javaメソッドが終了して呼び出してから、仮想マシンのスタックとスタック内のスタックにスタックフレームを意味します。

2.2仮想マシンのスタック機能

●コンパイルで所望のローカル変数テーブルメモリ空間の割り当てが完了して、Javaメソッドが実行され、スタックフレームに必要なローカル変数テーブルスペースが決定され、その位置は変化しません。

●2つのエラーが発生する可能性があり、仮想マシンのスタック:

  • 1.StackOverFlowError:スタックは動的拡張ない場合深さは、スタックフレームバーチャルマシンの最大深さ、および仮想マシンよりも大きい場合、それはこのエラーをスローします。
  • 2.OutOfMemoryError:仮想マシンがこの例外をスローし、スタックフレームをスタックに割り当てられ、十分なメモリではありませんしながら、仮想マシンが、動的な拡張を可能にします。

3.ネイティブメソッドスタック

理解の3.1ネイティブメソッドスタック

記載されている方法は、仮想マシンの役割とのスタックは非常に似ている、ローカルスタックメモリモデルネイティブメソッドです。

3.2機能ネイティブメソッドスタック

ネイティブメソッドとして●仮想マシン・スタックは、実行時にネイティブメソッドスタックのスタックフレームを作成します。

●組み合わせた仮想マシンのネイティブメソッドスタックおよびスタックへのHotSpot仮想マシン。

●ネイティブメソッドスタックもStackOverflowErrorが、OutOfMemoryErrorの例外をスローすることができます。

4. Javaヒープ

理解と行動の4.1ヒープ

唯一の目的は、Javaヒープオブジェクトのインスタンスを格納することで、オブジェクトインスタンスの大半は、メモリを割り当てるためにここにいます。

機能の4.2ヒープ

●Javaヒープメモリ領域は、面積の最大メモリフットプリントです。

●ヒープがガベージコレクションのメインエリアがあり、それはとも呼ばれる「GCヒープ。」

サバイバーに、サバイバーから、エデン:●を伴うメモリの回復の必要性に、さらに新しい世代と古い時代に細分Javaヒープは、新生代はに分けることができます。

●ヒープは、すべてのスレッドがデータのヒープにアクセスすることができますスレッドで共有されます。

●スタックは限り論理的に連続することができて、連続した物理メモリに配置することはできません。

●固定ヒープサイズも拡張することができますが、ヒープメモリ割り当ての欠如、およびヒープを再延長することができない、OutOfMemoryErrorがスローされます。

メソッド領域

5.1役割およびメソッドゾーンを理解します

●クラス、定数、変数、静的、タイムコンパイラコンパイルされたコードを介してメソッドを格納するためのローディングエリア。

●メソッド領域は、スタックの論理部分として記述され、ガベージコレクションプロセスゾーン過酷な条件(すなわち、メモリ領域を容易にリサイクルすることができない方法)ので、それは「永久世代」引数です。

特長5.2メソッドのゾーン

●メソッド領域は、スレッドで共有されています。

●メソッド領域ではあまり頻繁にガベージコレクションの振る舞い。

理解の5.3ランタイム定数プール

実行時定数プールエリアは、方法の一部であり、コンパイル時にクラスファイルタイプのpublic static final定数は、メソッド領域に格納されます。添加の方法は、String.intern()メソッドなどの動的拡張領域は、実行時に文字列定数プールに向かって話すことができるかもしれません。

6.ダイレクトメモリ

ダイレクトメモリの理解と行動

●ダイレクト・メモリは、Javaのメモリ領域の組成物に属していないが、また、Javaプログラムで使用することができます。

●NIOチャネルI / Oモードに基づいて、メモリとキャッシュを導入し、それは直接Javaのネイティブメソッド外部メモリ領域によって割り当てることができ、及びDirectByteBuffer Javaヒープによって操作オブジェクト、効率は、いくつかのシナリオを向上させることができます。

●ダイレクト・メモリ不足がOutOfMemoryErrorがスローされます。

おすすめ

転載: juejin.im/post/5d1874c8f265da1b94215f65