ホームページ  >  記事  >  Java  >  Javaのメモリ管理とメモリオーバーフロー例外の詳細な説明

Javaのメモリ管理とメモリオーバーフロー例外の詳細な説明

黄舟
黄舟オリジナル
2017-10-18 09:35:421671ブラウズ

以下のエディタでは、Java メモリ管理とメモリ オーバーフロー例外について簡単に説明します。編集者はこれがとても良いと思ったので、参考として共有します。エディターと一緒に見てみましょう

メモリ管理について、著者はまず Java と C、C++ の違いを比較したいと思います:

C と C++ では、メモリ管理はプログラマの責任です。これは、プログラマが大量のコード作成作業を完了し、システム メモリのメンテナンスを常に考慮する必要があることを意味します。Java では、プログラマはメモリの制御とメンテナンスを考慮する必要はなく、メモリの自動管理を JVM に任せます。メモリ リークやオーバーフローの問題が発生しにくいです。ただし、メモリ リークやオーバーフローの問題が発生すると、JVM のメモリ管理メカニズムを理解していなければ、エラーを見つけるのは困難です。

1. JVM ランタイム データ領域

Java プログラムを実行するとき、JVM は管理するメモリをいくつかの異なる領域に分割します。これらの領域はそれぞれ独自の目的を持つだけでなく、作成および破棄されます。 。一般的に、これには次のランタイム データ領域が含まれています:

オレンジ色の領域は各スレッドにプライベートです。つまり、各スレッドは独自のコピーを持ちますが、緑色の領域は各スレッドによって共有されます。

2.Javaオブジェクトの作成

クラスロードチェック

JVMが新しいキーワードをスキャンするとき、まずこの命令のパラメータが定数プールにあるかどうかを確認します。クラスのシンボリック参照。このクラスのシンボリック参照によって表されるクラスがロード、解決、および初期化されているかどうかを確認します。そうでない場合は、対応するクラスのロード プロセスを最初に実行する必要があります。

メモリ割り当て

クラス読み込みチェックに合格した後、JVM は新しいオブジェクトにメモリを割り当てる必要があります。これは、Java ヒープから特定のサイズのメモリを分割することを意味します。よく使用される除算方法は 2 つあります: ポインター衝突

(ヒープ メモリが完全に規則的である必要があります)、

フリー リスト (ヒープ メモリは規則的ではありません)。 メモリの初期化

JVM は、割り当てられたすべてのメモリ空間をゼロ値 (オブジェクト ヘッダーを除く) に初期化する必要があります。これにより、オブジェクトのインスタンス フィールドが、初期値を割り当てずに Java コード内で直接使用できるようになります。つまり、プログラムはこれらのフィールドのデータ型に対応するゼロ値にアクセスできます。

オブジェクトの初期化

プログラマの希望に従って メソッドを実行してオブジェクトを初期化します。

3. オブジェクトのアクセス場所

オブジェクトが作成された後、これらのオブジェクトに迅速にアクセスできるようにしたいと考えていますが、現時点では、ヒープ内の特定のオブジェクトを見つけるために JVM スタック上の参照データが必要です。最も一般的に使用されるアクセス方法は、「ハンドル メソッド

」と「

ダイレクト ポインター」です。 ハンドルメソッドを使用してアクセスする場合、ヒープ内のメモリの一部をハンドルプールとして分割する必要があり、参照変数にはオブジェクトのハンドルアドレスが格納され、ハンドルにはオブジェクトの特定のアドレス情報が含まれます。インスタンスデータとタイプデータ。

ダイレクトポインタアクセスを使用する場合、参照変数に格納されるのは直接オブジェクトアドレスですが、型データの関連情報をどのように配置するかを考慮する必要があります。

4. メモリ オーバーフロー例外

PC レジスタに加えて、JVM ランタイム データ領域の他のメモリ領域にもメモリ オーバーフロー例外が発生する可能性があります。 PC レジスタは、JVM 仕様で OutOfMemoryError (OOM) 条件が指定されていない唯一の領域です。

ヒープ オーバーフロー

Java のヒープは、オブジェクト インスタンスを格納するために使用され、オブジェクトが継続的に作成され、GC のリサイクルを避けるために GC ルートとオブジェクトの間に到達可能なパスがある場合、オブジェクトの数は最大値に達します。ヒープ容量が制限されている場合、ヒープ オーバーフロー例外が発生します。

スタック オーバーフロー (JVM スタックとローカル メソッド スタックを含む)

1. スレッドによって要求されたスタックの深さが、JVM によって許可される最大の深さを超える場合、StackOverflowError 例外がスローされます。 JVM がスタックを拡張している場合 十分なメモリ領域を適用できない場合、OutOfMemoryError 例外がスローされます。

他にも、メソッド領域のオーバーフロー、定数プールのオーバーフロー、ネイティブメモリのオーバーフローなどがあります。

以上がJavaのメモリ管理とメモリオーバーフロー例外の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。