【大量生産】JVMメモリ領域分割
Java VisualMachineのメモリ領域の分割
「「 断片化された時間、精巧な地元の知識。 」
学習の理由:
ただし、CおよびC ++言語と比較すると、JAVAでは、プログラマーが手動でメモリを割り当てたり、生成された(新しい)オブジェクトのメモリを解放したりする必要はありません。この作業は、プログラマーが忘れないように、JVMに渡して処理できます。死にかけているオブジェクトはメモリを解放し、メモリリークとメモリオーバーフローのリスクを引き起こします。ただし、ハードウェアとソフトウェアの構成およびコードロジックによって制限されるため、JAVAはJVMによるメモリの割り当てと解放を自動的に管理し、メモリのリークとオーバーフローも発生する可能性があります。したがって、メモリのリークとオーバーフローに対処するために、JVMがメモリを管理および解放する方法を理解する必要があります。
今回は、JVMメモリの自動割り当てに関する知識の一部についてのみ説明します。JVMメモリ領域の分割、メモリの解放(つまり、ガベージコレクション)、およびメモリ割り当ての詳細については、後で説明します。
知識予備:
オペレーティングシステムの各プロセスには、それ自体が管理するメモリ領域があります。同様に、JVMもプロセスに属し、JVMにも独自の管理に属するメモリ領域(メモリ領域Dとして設定)があります。JVMプロセスで実行されているすべてのJavaプログラムは、このメモリ領域Dを使用します。DをランタイムデータエリアDと呼ぶことができます。
長編映画の始まり:
JVMは、以下に示すように、ランタイムデータ領域Dをいくつかのパーティションに分割します。
プログラムカウンター:
オペレーティングシステムプロセスのプログラムカウンターに似ていますが、ここでのプログラムカウンターは、JVMで実行されているjavaプログラムのスレッドのプログラムカウンターを指します。これは、現在バイトコード命令を実行しているスレッドの行番号を配置するために使用され、各スレッドには排他的があります。プログラムカウンター。スレッドカウンター部分は、OutOfMemoryErrorが存在しない唯一の領域です。
Java仮想マシンスタック:
スレッドの分離。Javaスレッドの実行中にメソッドが呼び出されるたびに、スタックフレーム(スタックフレーム)がJava仮想マシンスタックに作成されます。スタックフレームには、ローカル変数テーブル、オペランドスタック、動的接続、およびメソッド出口が格納されます。およびその他の情報。メソッドが呼び出された後、メソッドのスタックフレームがポップされます。したがって、メソッドの継続的な呼び出しは、スタックへの継続的なプッシュを意味します。Java仮想マシンスタックの存在は、それを所有するスレッドが、呼び出し元のメソッドがどのプロセスを通過したかを記憶するのに役立ち、それによってロジックの正確性を保証します。
各仮想マシンには仮想マシンスタックのスタック深度制限があり、スレッド内のメソッド呼び出しが深度を超えると、StackOverFlowError例外がスローされることに注意してください。Java仮想マシンの容量が拡張を許可する場合、スタック深度が制限を超えない場合ただし、スタック容量が制限を超えて容量を拡張する必要がある場合、十分なメモリが使用できないと、OutOfMemory例外がスローされます。
ネイティブメソッドスタック:
ネイティブメソッドスタックとjava仮想マシンスタックの機能は似ていますが、ネイティブメソッドサービスがネイティブメソッド呼び出しであり、java仮想マシンスタックサービスがjavaメソッド呼び出しである点が異なります。ネイティブメソッドはローカルメソッドと呼ばれることが多く、他のメソッドが使用されます。言語の実装方法。
Javaヒープ:
スレッド間で共有されるjavaヒープは、仮想マシン管理メモリの最大の部分です。このメモリ領域の唯一の目的は、オブジェクトインスタンスを格納することです。Javaの「ほぼすべて」のオブジェクトインスタンスは、ここでメモリを割り当てます。Javaヒープは、ガベージコレクターによって管理されるメモリの領域です。エリアサイズと拡張を許可するかどうかを設定できますが、OutOfMemory例外があります。
メソッドエリア:
スレッド間で共有され、仮想マシンによってロードされたタイプ情報(まだクラス情報)、定数、静的変数、ジャストインタイムコンパイラによってコンパイルされたコードキャッシュなどのデータを格納するために使用されます。この部分は、ヒープメモリを区別するために「非ヒープ」と呼ばれることがよくあります。このエリアにもゴミ収集が必要ですが(主にプールの定期的な収集とタイプのアンロードのため)、リサイクルの頻度ははるかに少なくなります。また、OutOfMemoryの例外もあります。
直接記憶の概念
仮想マシンの実行中は、ダイレクトメモリはデータ領域の一部ではありません。ただし、この部分も頻繁に使用され、OutOfMemory異常を引き起こす可能性もあります。メモリのこの部分は、JVMのメモリ領域の一部も占めています。仮想マシンのパラメータを設定するときは、この部分をお見逃しなく。
参照:
「Java仮想マシンの詳細な理解:JVMの高度な機能とベストプラクティス(第3版)」
第II章、セクション2.2のデータ領域
を実行します:Zhou Zhiming
ISBN:9787111641247
尾:
上記の知識のポイントはあなた自身の理解に統合されています。質問や欠陥がある場合は、コメントセクションまたはプライベートメッセージで気軽に話し合ってください。