メモリオーバフロー例外のJVMランタイムデータ領域[A]

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


:仮想マシンの仕様では、Java仮想マシンのメモリ管理は、(1.7に基づいて)以下のランタイム・データ領域が含まれます
ここに画像を挿入説明
(1.8に基づいて)次の図で説明するように、各地域に:
ここに画像を挿入説明

1.プログラムカウンタ

プログラムカウンタは、小さなメモリ空間であり、主な役割は、実行スレッドのバイトコードの行番号を格納することです

マルチスレッドのJava仮想マシンが順番にあるので切り替えてプロセッサの実行時間の割り当ては唯一のプロセッサ命令の実行中に、一度にスレッドによって一つのスレッドを達成しました。したがって、スレッドを切り替えるために実行の正しい位置に戻すことができ、各スレッドは、別々のプログラムカウンタを必要とします。

このメモリ領域は、任意の領域のOOMの状況を指定していないだけで、Java仮想マシン仕様であります

2. VMスタック

仮想マシンのスレッドスタックは、スレッドのスタックの一部を作成するときにスレッドごとに、JVMのスレッドが作成され、プライベートです。VMのスタックが記載されています実行のメモリモデル方法:スタックフレームは、メソッド呼び出しを実行するための仮想マシンのデータ構造および方法をサポートするために使用され、そして各方法は、ローカル変数テーブルを格納するためのスタックフレームを作成するために、スレッド・スタック上で実行され、オペランドスタック、動的リンク方法輸出およびその他の情報。各方法は、仮想マシン内のスタックをプッシュするスタックフレームの対応する上での実行の最初から最後まで行います。

スレッド・スタックに対応し、スタックフレーム対応方法

イベント・スレッドでは、スタック・スタック・フレームの上部は、実行されるメソッドは、現在の方式と呼ばれ、現在のスタックフレームと呼ばれます。ランタイム実行エンジンでは、すべての命令は、現在のスタックフレーム上でのみ動作します。プッシュとスタックモードによるVMスタック、各アクティブなスタックフレーム演算処理に対応する方法メソッドが正常に完了され、それは別のスタック・フレームにジャンプします。このメソッドが呼び出された場合、それはこの方法に輸出用であるスタックフレームを、呼び出すためにジャンプします。例外がある場合は、例外が戻ってくる、リターンアドレスは、例外処理テーブルによって決定しました。

すべての基本データ型に格納されたローカル変数テーブル、オブジェクト・リファレンス前記長いダブル長さ64ビットのデータが、2つのローカル変数のスペースを占有するだけつの他のタイプを占めます。コンパイル時に割り当てを完了するために必要なローカル変数テーブルメモリ空間この方法は多くの方法に入るフレームに割り当てられたローカル変数のためのスペース明確に定義されているが必要な場合、この方法は、動作中にローカル変数の大きさを変化させません。

オペランドスタックは、命令を行うことができることは、スタックフレームは、メソッドを実行するJVMによって作成されたときに、スタック構造であるメソッドのスタックフレーム内のオペランドスタックを作成し、メソッドを確実にします。

動的リンク:各スタックフレームは、現在の方法に定数プールの参照を含む、目的は、メソッド呼び出しをリンクする動的処理をサポートすることです。

リターンアドレスの方法:2つのメソッドを実行することから出るあります(例えば、RETURN、IRETURN、ARETURNとして遭遇戻りバイトコード命令)正常終了、中止2 ... どちらかが呼び出された位置メソッドに返す必要があり、終了します。1つのリターンスタックフレームユーバー上値;コールを実行した後、次のプログラムカウンタ3スロー処理することができる2例外スタック・フレーム情報:方法出口プロセスがポップアップ現在のスタックフレームと同等であるが、出口への3つの方法があり...指示。

仮想マシン仕様、これはメモリ例外の2つの領域を提供します。スレッド要求は、仮想マシン、スロー例外にStackOverflowErrorで許可された深さよりも大きな深さを積み重ねる場合、スタックは動的に拡張する場合は2を仮想マシンに適用することはできません。十分なメモリ、OOMがスローされます。

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

ホットスポットは、単にネイティブメソッドスタックを実装し、組み合わせた仮想マシンを積み重ねるように、今、Javaは非常に成熟してきたことを、ネイティブメソッドは、基本的なほど使用しています。

4.ヒープ

ヒープは、Java仮想マシンが管理するメモリの最大の作品それがすべてですスレッドシェア仮想マシンの起動時に、作成されました。その唯一の目的は、オブジェクトを格納することですメモリのヒープ割り当て(JITコンパイラ技術の成熟し、エスケープ分析、スタック上の割り当ての発展とともに、スカラー交換用の最適化技術は、オブジェクトがヒープに割り当てされないことが原因になります)、Java仮想マシン仕様で、だから、ほとんどすべてのオブジェクトインスタンス説明:すべてのオブジェクトインスタンスおよびアレイはヒープ上に割り当てられます。

ヒープガベージコレクタ(読み取り推奨JVMのガベージコレクタを[3]メインエリア)管理:集電体は基本的に世代コレクションアルゴリズムを使用しているビューのメモリ回復の観点から、1、(読書推奨[2] JVMのガベージコレクションのアルゴリズムと戦略をスタックはまた、新しい世代と古い時代に細分化することができるので、)、その後、より慎重エデン領域に、サバイバー領域から、サバイバー領域に2メモリ割り当ての観点から、スタックがプライベートバッファ(ローカルスレッドバッファ割当,.割り当てられた複数のスレッドに分割することができるTlabを):オブジェクトが優先的に割り当てられました新世代領域エデン、機構影響オブジェクト分配速度をロック回避するためにマルチスレッド環境では、JVMは、各スレッド(プライベートキャッシュ領域を割り当てることができるTlab)、この空間割り当てる際共有スレッドを使用する場合、スレッドは、排他的です故にヒープは、すべてのスレッドで共有されていません本質的には、TLAB管理は3つのポインタに依存しています:開始、終了、トップは、開始と終了エデンのTLAB管理の領域にマークされている他のスレッドがメモリを割り当てるとき、この領域は、トップポインタが割り当てられ、使用されることはありませんときにメモリ割り当てから始まる位置に開始点、トリガーTLABリフィル端に等しいときにゆっくりと、端に近づきます。いずれの場合においても、ヒープ・オブジェクトが格納されています。

TLAB構造:
ここに画像を挿入説明
エデン領域の構造:
ここに画像を挿入説明
ヒープメモリ構造:
ここに画像を挿入説明

ヒープウォーカーツールメモリ:(JConsoleのとVisualVm- Iの使用はこれで、あなたはプラグインのVisual GCをインストールすることができ、ナビゲーションバーの[ツール] - > [内部のアドインの追加)
ここに画像を挿入説明

知識延びる:上面図cpuコマンドの使用、代表的な平均1分、5分、15分のシステム負荷平均をロードし、システム負荷に基づいて、これらの3つの数字は、大きいか小さいです。CPUが完全にアイドル状態である場合、平均負荷は0であり、CPUのワークロードが平均ロード1を飽和します。
ここに画像を挿入説明

Java仮想マシンの仕様では、Javaヒープは限りディスクスペースのような、論理的に連続したとして、不連続な物理メモリ空間であってもよいです。実装された場合、HotSpot仮想マシンが拡張可能に実装されている(最小ヒープ空間-Xmsによって、最大ヒープ領域-Xmx、新世代制御パラメータ-Xmnのサイズ)。そこに割り当てオブジェクトのインスタンスを完了するためにスペースがなく、もはやヒープを拡張することができた場合、それがOOMます。

メソッド領域

すべてのスレッドを格納するために使用されるメモリ領域を共有するようにメソッド領域とJavaヒープは同じですクラス情報は、コードやその他のメタデータをコンパイルするには、仮想マシン、定数、静的変数、時間コンパイラにロードされています、クラスが最初にロードされるたびに、彼はメタデータ領域の方法に配置されます。

メソッド領域は、仮想マシンの仕様からのランタイムデータ領域が最もリベラルの管理を規定している、Java仮想マシン仕様は、メソッド領域を実装する方法を指定しないと、メソッド領域の要件の明確な位置がありません。HopSpot(前JDK1.8)が、メソッド領域別々の論理領域、および物理的に独立して、スタックの存在しないが、永久的な世代に位置しますしたがって、このタイムゾーンの方法は、また、ゴミをリサイクルすることができます。

HotSpot仮想マシンのデザインチームGC世代のコレクションは、メソッド領域に拡張しているため、このようHotSpotのガベージコレクタのヒープ管理は、メモリ管理の一環として、このようにすることができ、非常に多くの人々と呼ばれるメソッド領域を「永遠の世代。」しかし、恒久的な世代のメソッド領域を達成することは簡単にメモリオーバーフローにつながることができます。JDK1.7では、本来の文字列定数プールエリア内のホットスポットは、ヒープメソッドに移動されます。JDK1.8は永久(ローカルメモリ内の)素子空間あるいは、メタデータ情報のストレージクラス(フィールド法)、静的プロパティ、定数を代入しています。

自然と宇宙のような領域元の方法には、JVMの指定方法エリアの実現であるが、元の間のスペースとの最大の違いは、メソッド領域ということです:人民元は、仮想マシン内のスペースはありませんが、ローカルメモリを使用します。したがって、デフォルトでは、要素の空間の大きさは、ローカルメモリの制限によって。

同じのこの部分とは、ガベージコレクションを実装しないことを選択することができる、連続スタックメモリを必要とせず、一定のサイズを選択することができますまたは拡張することができます。メモリ復旧対象のゾーン法は、主にリサイクルし、クラスの定数プールをアンロードするためのものですが、クラスのアンロード条件は厳しいですが、領域メモリのリコールのこの部分が必要です。

パラメータ調整を、対応するJVM:
ここに画像を挿入説明
Java仮想マシンの仕様によると、メモリの割り当て領域の方法は、需要を満たすことができないときは、OOMでしょう。

6.ランタイム定数プール

実行時定数プールは、ゾーン方式の一部です。クラス、フィールド、メソッド、およびインターフェース記述情報に加えて、クラス・ファイルのバージョン、ならびに定数プール情報。次いで、4バイトクラスのファイルのバージョン番号に格納されている;第一各ファイルの4つのバイトは、マジックナンバーと呼ばれるクラスが、その目的は、仮想マシンが受け入れ可能なファイルであるかどうかを決定することである次のバージョン定数プールエントリ番号です。様々な定数プールの参照符号(例えば、テキスト文字列、最終的な一定値として)生成されたリテラルコンパイラを(これらのフィールドのシンボルの参照記号は、実メモリ・アドレス・エントリを取得するために実行時に変換される)を記憶します、この部分は、クラスローディング時定数プール後の動作領域方法に格納されます。

Java仮想マシン仕様には、実行時定数は、要件のいずれかの詳細をプールませんが、ファイル形式クラスの定数プールは、厳格な要件があります。一般的には、クラスの参照は直接参照実行のうち、翻訳されるファイルシンボル説明を保存するだけでも、一定のプールに格納されます。

クラスの他の重要な特徴のためのランタイム定数プールは、ファイルの定数プールは動的で含まれています。必ずしもコンパイル時定数を生成するために、実行時も一定(Stringクラスのインターン()メソッド)のプールを配置することができます。

7.ダイレクトメモリ

メモリは、JVMランタイムデータ領域の直接の一部ではない、またそれは、Java仮想マシンのメモリの仕様で定義された領域が、また、OOMです。

NIO JDK1.4新たに追加されたカテゴリ、バッファI / Oモードとチャネルの導入に基づいて、ネイティブライブラリを直接ヒープメモリの外部に割り当てられ、そしてDirectByteBuffer Javaヒープメモリ参照としてこのオブジェクトを格納することによってすることができます操作。これにより、パフォーマンスが向上し、Javaネイティブでヒープとスタックを回避するために、コピーデータを前後。

ここに画像を挿入説明

ダイレクトメモリをJavaヒープのサイズによって限定されるものではなく、物理的なメモリを制限され、それはまた、OOMの動的拡張を生じることができます。

要約:
プログラムカウンタに加えて1、他のすべてのメモリ領域は、OOMを発生する、
プロセスを実行するメモリ使用2.java
ここに画像を挿入説明

公開された11元の記事 ウォンの賞賛0 ビュー611

おすすめ

転載: blog.csdn.net/fei1234456/article/details/105037544