Java基础の作成の仮想マシンオブジェクトのプロセスを详しくまとめます。


一、オブジェクトの作成
在这里插入图片描述
1.1 newクラス名
仮想マシンがnewコマンドに遭遇したとき , 、
1.2メモリの割り当て
仮想マシンは新しいオブジェクトにメモリを割り当てます。 , Java
(1)メモリ割り当ての方式は2つあります。
:javaスタックが整理されている場合、使用済みメモリの一方に空きメモリがあり、中間の一つのポインタが境界インジケータとして使用されます。メモリを割り当てるには、オブジェクトと同じ大きさの空間を空いている場所にポインタを移動します。
:不正であれば、使用済みメモリと空きメモリが相互にインターリーブされる。仮想マシンはリストを維持して、どのメモリが使えますか?メモリを割り当てる時、テーブルを調べて十分なメモリを見つけ、リストレコードを更新します。 :仮想マシンの仮想マシンが圧縮整理機能を有する場合、システムはポインタ衝突メモリ割り当てアルゴリズムを採用する。空きリストのアルゴリズムを使用します。
(2)スレッド安全問題
併発時、上の2つの方法でメモリを割り当てる操作はスレッドの安全ではありません。2つの解決策があります。
JVMはCAS(Compre and Swap)機構を採用して失敗再試験の方式を加えて、更新操作の原子性を保証します。
CAS:3つの操作数、メモリ値V、古い予想値Aがあります。修正する新しい値Bがあります。そして、予想値Aとメモリ値Vが同じである場合のみ、メモリ値VをBに変更します。そうでなければ、何もしません。
(TLAB)メモリを割り当てる動作をスレッドによって異なる空間に分けて行います。各スレッドはJavaスタックに予め小さいメモリを割り当てておき、ローカルスレッド割り当てバッファエリア(Thread Local Allocation Buffer、TLAB)といいます。どのスレッドにメモリを割り当てる必要がありますか?どのスレッドのTLABに割り当てられますか?TLABが使い終わったら、新しいTLABを割り当てる必要がある時だけ、同期処理が必要です。
JVMは「-XX:+/-UseTLAB」でTLABを使用するかどうかを指定します。
1.3ゼロ値を初期化する
メモリ割り当てが完了したら、仮想マシンは割り当てられたメモリ空間をすべてゼロに初期化する必要があります。TLABを使用するとTLABの割り当て時に行います。これは ( ) , です。
1.4設定対象情報
仮想マシンは、オブジェクトに対して必要な設定を行う。例えば、このオブジェクトはどのような種類のインスタンスであり、どうやって種類のメタデータ情報、オブジェクトのハッシュコード、オブジェクトのGC世代年齢などの情報を見つけることができるか。これらの情報はオブジェクトのオブジェクトヘッダに格納されます。
1.5オブジェクトを作成する init , 。これで本当に使えるオブジェクトは完全に構成されます。
二、オブジェクトのメモリレイアウト
Hot Spot仮想マシンでは、オブジェクトがメモリに格納されているレイアウトは、3つの領域に分けることができる。 、Instance Data、 (Padding)。
2.1オブジェクトヘッダ
HotSpot仮想マシンのオブジェクトヘッドは2つの部分を含んでいます。
(1)第1の部分は に用いられ、この部分のデータの長さは32ビットと64ビットの仮想マシンでそれぞれ32 bitと64 bitであり、公式には「Mark Word」と呼ばれている。
在这里插入图片描述
(2)他の部分は であり、オブジェクトがそのクラスのメタデータを指すポインタであり、 である。
すべての仮想マシン実装は、オブジェクトデータ上にタイプポインタを保持しなければならないわけではない。つまり、オブジェクトのメタデータ情報は、必ずしもオブジェクト自体を通過する必要はない。
また、オブジェクトがJava配列である場合、オブジェクトの先頭には、アレイ長を記録するためのデータが必要である。仮想マシンは、通常のJavaオブジェクトのメタデータ情報によってJavaオブジェクトのサイズを決定することができるが、配列のメタデータから配列のサイズを決定することができない。
2.2インスタンスデータ
インスタンスデータ部分は であり、プログラムコードに定義された様々なタイプのフィールドコンテンツでもある。 , , 。この部分の記憶順序は、仮想マシン割り当て戦略パラメータとJavaソースの定義順序によってフィールドの影響を受ける。
HotSpot仮想マシンのデフォルトの割り当てポリシーは、longs/doubles、ints、shots/chars、bytes/boot leans、oopsです。割り当てポリシーから が示されている。この前提条件を満たす場合は になる。CompectFiedsパラメータ値がtrue(デフォルトはtrue)であれば、サブクラスの狭い変数が親変数のすき間に挿入されることもあります。
2.3配置充填
整列充填は必然的に存在するものではなく、特別な意味もない。彼は だけである。HotSpot VMの自動メモリ管理システムは、オブジェクトの開始アドレスが8バイトの整数倍でなければならないことを要求しているので、言い換えれば 8 , 8 , , , である。
三、オブジェクトのアクセス位置
オブジェクトを使用するために作成されたオブジェクトです。
referenceタイプはJava仮想マシン規範において、オブジェクトへの参照を規定していますが、この参照はどのようにして訪問チームの中のオブジェクトの具体的な位置を特定するべきかを定義していません。したがって、オブジェクトのアクセス方法も仮想マシンによって実現されるものです。現在主流の方式はハンドルと直接ポインタの2種類を使います。
3.1ハンドルを使う
ハンドルでアクセスすると、Java reference
在这里插入图片描述
3.2ポインター方式
ポインタでアクセスする場合、Javaスタックオブジェクトのレイアウトは、アクセスタイプデータの関連情報をどのように配置するかを考慮しなければならず、Java ,reference , は、オブジェクト自体にアクセスするだけで、間接的なアクセスのオーバヘッドが少なくなる。
在这里插入图片描述
四、二種類の方式の比較
文のアクセスの最大の利点はreference です。
ポインタアクセス方式の最大の利点はreference , , reference であり、下の部分へのアクセスがJavaで非常に頻繁であるため、このようなオーバヘッドが蓄積された後も非常に大きな実行コストである。
以上、Java基础に関する仮想マシンオブジェクトの作成プロセスを详しくまとめた文章をここに绍介します。より多くの関连仮想マシンのオブジェクトの作成プロセス内容は、私たちの以前の文章を検索したり、以下の関连する文章を引き続きご覧ください。これからもよろしくお愿いします。