記事ディレクトリ
提示:以下是本篇文章正文内容,下面案例可供参考
1. Java オブジェクトを作成するプロセス?
-
クラス ロード チェック
仮想マシンが新しい命令を検出すると、まず命令のパラメータに従って定数プールに移動し、このクラスのシンボル参照を見つけられるかどうかを確認し、このクラスによって表されるシンボル参照が存在するかどうかを確認します。ロードされ、解析され、初期化されました。そうでない場合は、対応するクラスのロード プロセスを最初に実行する必要があります。 -
メモリの割り当て
クラス ロード チェックに合格すると、仮想マシンは新しいオブジェクトにメモリを割り当てます。オブジェクトに必要なメモリ サイズは、クラスがロードされた後に決定できます。オブジェクトにスペースを割り当てるタスクは、オブジェクトを移動することと同じです。 Java ヒープは、「ポインタ衝突」と「フリー リスト」の 2 つの割り当て方法に分かれており、どちらの割り当て方法を選択するかは、Java ヒープが正規かどうかによって決まり、Java ヒープが正規かどうかは、メモリの一部であるかどうかによって決まります。ガベージコレクタは圧縮を持っています。仕上げの機能によって決まります。
2 種類のメモリ割り当て:- ポインタの衝突
該当する場合: ヒープメモリが正常な場合 (つまり、メモリの断片化がない場合)
原則: 使用済みメモリを片側に置き、未使用メモリを反対側に置き、中央に境界ポインタがあり、ポインタだけが空きメモリを指す必要がある オブジェクト メモリ サイズの領域を方向に移動するだけ
この割り当て方法を使用する GC コレクタは、Serial、ParNew です。 - フリー リスト
該当する状況: ヒープ メモリが不規則な場合
原則: 仮想マシンは、どのメモリ ブロックが利用可能であるかを記録するリストを維持します。割り当てる際には、オブジェクト インスタンスに割り当てるのに十分な大きさのメモリ ブロックを見つけ、最後にそれを更新します。 リスト レコード
この割り当て方法を使用する GC は次のとおりです。 CMS
メモリ割り当ての同時実行の問題 (補足コンテンツ、習得が必要)
- ポインタの衝突
実際の開発プロセスではオブジェクトの作成が非常に頻繁に行われるため、オブジェクトを作成する際にはスレッド セーフという非常に重要な問題がありますが、仮想マシンとしてはスレッドの安全性を確保する必要があります。スレッドの安全性を確保するための 2 つの方法:
CAS + 失敗時の再試行: CAS は楽観的ロックの実装です。いわゆる楽観的ロックとは、毎回ロックを行わずに競合がないと仮定して操作を完了し、競合により失敗した場合は成功するまで再試行するというものです。仮想マシンは、更新操作のアトミック性を確保するために、失敗時の再試行を伴う CAS を使用します。
TLAB: 各スレッドの Eden 領域にメモリを事前に割り当てます。JVM がスレッド内のオブジェクトにメモリを割り当てるとき、最初に TLAB に割り当てます。オブジェクトが TLAB の残りのメモリまたはメモリよりも大きい場合は、 TLAB が使い果たされた場合は、上記の CAS を使用してメモリ割り当てを実行します
-
ゼロ値の初期化
メモリ割り当てが完了したら、仮想マシンは割り当てられたすべてのメモリ領域をゼロ値に初期化する必要があります (オブジェクト ヘッダーを除く)。この手順により、オブジェクトのインスタンス フィールドを Java コード内で直接使用できるようになります。初期値を割り当てると、プログラムはこれらのデータ フィールドに対応するゼロ値にアクセスできます。 -
オブジェクト ヘッダー
の設定 ゼロ値の初期化が完了したら、仮想マシンは、オブジェクトがどのクラス インスタンスであるか、クラスの元のデータ情報を検索する方法、クラスのハッシュ コードなど、オブジェクトに必要な設定を実行する必要があります。オブジェクト、およびオブジェクトの GC パーティションの経過時間。この情報はオブジェクト ヘッダーに保存されます。また、仮想マシンの実行状況やバイアスロックを有効にするかどうかなどにより、仮想マシンの設定が異なります。 -
init メソッドの実行
上記の手順が完了すると、仮想マシンの観点からは新しいオブジェクトが生成されますが、Java プログラムの観点からはオブジェクトの作成が開始されたばかりであり、init メソッドは実行されていません。まだ。すべてのフィールドは 0 のままであるため、一般に、新しい命令の実行直後に init メソッドが実行され、プログラマの希望に従ってオブジェクトが初期化され、真に使用可能なオブジェクトが完全に生成されます。