--Javaメモリ領域「Java仮想マシンの深い理解」

ランタイムデータ領域: 

       それは別のデータ領域の数を管理しますれているJavaプログラムの実行中のJava仮想マシンのメモリ部門。下図のように:


地域の特徴:

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

  • それは見ることができ、より小さなメモリ空間です当前线程所执行的字节码的行号指示器バイトコードインタプリタは、次に実行する命令、ブランチを選択するために、カウンタのバイトコードの値を変更することにより、作業ループ、分岐、例外処理、およびその他の基本的な機能のスレッドの復旧が完了するまでにカウンターに依存している。した場合
  • マルチスレッドJava仮想マシンが旋回しているので、いつでも、プロセッサ、決定を達成するためのスレッドによるモード実行時間とプロセッサの割り当てを切り替えるだけ実行する(マルチコアプロセッサのためのカーネルです。)命令のスレッド。そのため、为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
  • スレッドは、Javaメソッドを実行している場合、カウンタは、実行中の仮想マシンのバイトコード命令のアドレスを記録し、この方法は、ネイティブに実行されている場合、このカウンタ値が(未定義)nullです。このメモリ領域があります唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域

2.Java仮想マシンのスタック(Java仮想マシンスタック)

  • VMスタックは記載されているJava方法执行的内存模型各メソッドは、情報を格納するためのローカル変数テーブルを行いながら、スタックフレーム(スタック・フレーム)を作成し、オペランドスタック、動的リンク、方法輸出。実行手順が完了するまで各方法は、仮想マシン・プロセス・スタック内のスタックをプッシュするために、対応するスタックフレームと呼ばれます。
  • 局部变量表様々な基本的な保存されたデータのタイプ(ブール、バイト、文字、ショート、整数、フロート、長い、二重)知り得るコンパイルし、オブジェクト参照(参照型、それはオブジェクト自体と等価ではないが、オブジェクトの開始アドレスへのポインタであってもよいです参照ポインタは、このまたは他の標的位置に関連付けられたオブジェクトハンドル)とRETURNADDRESS型(バイトコード命令を指し示すアドレス)を示す点であってもよいです。
  • 長い長さ64ビットのデータの二重基本データ・タイプは、残りのデータは、一種類のみを占有し、2つのローカル変数空間(スロット)を占めます。ローカル変数テーブルメモリ空間の所望の编译期间完成分配方法を入力する場合、この方法は、フレームに割り当てられたローカル変数が完全に決定されるために多くのスペースを必要とし、在方法运行期间不会改变局部变量表的大小。

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

そして、仮想マシン(すなわち、バイトコード)サービス、ネイティブメソッドスタック、ネイティブを使用する仮想マシンの役割は非常に似ていますが、それらの間の違いはJava仮想マシンのメソッドのための仮想マシンの実行スタックであるスタックサービスの方法。

4.Javaスタック(Javaヒープ)

  • ほとんどのアプリケーションでは、Javaヒープメモリは、Java仮想マシン管理の最大の作品です。Javaヒープは、仮想マシンの起動時に作成されたメモリ領域内のすべてのスレッドで共有されています。このメモリ領域は唯一目的就是存放对象实例、ほとんどのオブジェクトインスタンスのすべてがここにメモリを割り当てることができます。
  • Javaヒープのガベージコレクションは、我々はメモリの回復の観点から見ればそれほど頻繁にも起因する集電体に、「GCヒープ」(ヒープガベージコレクション)と呼ばれるメインエリアは、基本的には世代コレクションアルゴリズムを採用して管理しますそのJavaヒープはまたに分けることができます。古いものと新しい世代の、小さなディテールがサバイバースペースから、サバイバースペースに、エデンスペースにあります。分裂をとにかく、関係なく、どの領域の、コンテンツの保存とは何の関係もありません、まだオブジェクトインスタンスに格納され、更なる目的は、メモリのより良い回復、またはより高速なメモリ割り当てにある分割。
  • Java仮想マシンの仕様では、Javaヒープは、私たちのディスクスペースのように、限り、論理的に連続に、不連続な物理メモリ空間であってもよいです。いずれかの固定サイズとして実現することが可能で実装する場合、拡張することができるが、現在主流の仮想マシンは、ヒープがあれば、達成するスケーラビリティ(-Xmsスタック、-Xmx最大ヒープ領域を初期化することによって)に従っていますメモリの割り当てが完了例はなく、拡張時にヒープができない、それはOutOfMemoryErrorがスローされます。

メソッド領域(方法エリア)

  • Javaヒープのように、各スレッドは、仮想マシンにロードされたクラス情報を格納するために使用される共有メモリ領域であり、定数は、静的変数は、タイムコンパイラは、コードおよび他のデータをコンパイルしますメソッド領域に記載されているように、Java仮想マシン仕様は、ヒープの論理的な部分であるが、それは非ヒープ(非積層)という別名を有するが、Javaヒープ・オブジェクトは区別されるべきです。
  • 运行时常量池(実行時定数プール)のために、ゾーン法の一部です存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放クラス定数プールへの実行時定数プールファイルの相対的なもう一つの重要な機能が装備され动态性、必ずしもそれだけでは、頻繁に実行ゾーン法を入力するには、クラスファイルの定数プールの内容を事前に設定されていない、生成するためにコンパイルJava言語は、一定の必要はありません、実行中のプールの量は、プールに新しい定数であり、この機能を利用する開発者のインターンは、Stringクラス()メソッドよりも多いです。

6.ダイレクトメモリ(ダイレクト・メモリ)

ていない仮想マシンの実行時データ領域の一部、また仕様で定義されたそれは、Java仮想マシンのメモリ領域であるが、このメモリはまた、頻繁に使用され、また、OutOfMemoryErrorの例外につながる可能性があります。それはその後、確かにまだマシンの総メモリサイズとプロセッサのアドレス指定可能なスペースによって制限され、メモリであることから明らかなように、ダイレクトメモリ割り当てネイティブJavaヒープサイズは、しかし、限定されるものではありません。サーバ管理者は、実際のメモリ情報-Xmx一般的なパラメータに基づいて、仮想マシンのパラメータを設定するが、多くの場合、各メモリ領域の合計が(オペレーティング・システム・レベルと物理的な制限を含む)の物理メモリの制限よりも大きくなるように、ダイレクトメモリを無視する場合OutOfMemoryErrorが発生の原因とするときに、動的拡張を生じます。


おすすめ

転載: juejin.im/post/5d54f2976fb9a06b2c3288fc