二(2)HotSpot仮想マシンオブジェクトプローブ

1986 ワード

HotSpot仮想マシンのJAVAスタックにおけるオブジェクトの分配、配置とアクセスの過程を深く検討する.
オブジェクト作成プロセス
ここでいう作成オブジェクトは配列とClassオブジェクトを含まない.
1.まず、このクラスがロード、解析、初期化されているかどうかを確認する.ない場合は、まず対応するクラスのロードプロセスを実行する必要があります.
  • は、次に、新生オブジェクトにメモリを割り当てる.関連メモリのサイズは、クラスのロードが完了すると完全に決定する.
  • メモリの割り当てが完了すると、仮想マシンは割り当てられたメモリ領域をすべてゼロ値に初期化する必要がある.(対象ヘッダを除く)TLABを用いる場合には、TLAB割り当て時に繰り上げることも可能である.
  • 次に、仮想マシンは、このオブジェクトがどのクラスのインスタンスであるか、どのようにしてクラスのメタデータ情報、オブジェクトのハッシュコード、オブジェクトのGC世代年齢などの情報を見つけることができるかなどのオブジェクトを必要とする.これらの情報は、オブジェクトヘッダに配置され、
  • .
  • initメソッドを実行する.プログラマーの意思に従って初期化を行う.

  • オブジェクトのメモリレイアウト
    メモリに格納されたオブジェクトのレイアウトは、オブジェクトヘッダ(header)、オブジェクトヘッダ(header)、インスタンスデータ(Instance Data)と整列充填(Padding).
  • のオブジェクトヘッダは、MarkWordの2つの部分を共有する、フラグビットによって異なるコンテンツを格納するために使用される、ハッシュコード、GC世代別年齢、ロック状態フラグ、スレッドが持つロック、バイアススレッドID、バイアスタイムスタンプなど、オブジェクトヘッダの他の部分はタイプポインタであり、彼のクラスメタデータのみを考えるポインタである.しかし、すべての仮想マシン実装がオブジェクトデータにタイプポインタを保持する必要があるわけではない.また、オブジェクトが配列である場合、再オブジェクトヘッダには、配列長を記録するためのデータが1つ必要である.
  • のインスタンスデータ部分は、オブジェクトが真に記憶する有効な情報であり、親クラスが継承したものであっても、子クラスで定義するものであっても記録する必要がある.格納順序は、仮想マシンの割り当てポリシーパラメータとフィールドがJAVAソースコードで定義順序によって影響される.
  • の整列充填部分は必ずしも存在するものではなく、占有作用のためだけである.HotSpotの自動メモリ管理システムは、オブジェクトの開始アドレスが8バイトの整数倍であること、すなわち、オブジェクトのサイズが8バイトの整数倍であることを要求するからである.そのため、この部分の内容は整理するためである.

  • オブジェクトのアクセス先
    オブジェクトのアクセス方法は、仮想マシンの実装によって異なるが、現在主流の使用ハンドルと直接ポインタの2種類がある.
  • ハンドルアクセスを使用すると、JAVAスタックにはハンドルプールとしてメモリが分割され、referenceにはオブジェクトのハンドルアドレスが格納.ハンドルには、オブジェクトインスタンスデータとデータのそれぞれのアドレス情報が含む.

  • ハンドルの2つの部分は、スタックメモリのオブジェクトデータとメソッド領域のタイプデータをそれぞれ指します.
  • ダイレクトポインタを使用するアクセスすると、referenceはスタック内のオブジェクトインスタンスを直接指し、オブジェクトにはメソッド領域タイプデータを指すポインタが含まれる. ,HotSpot , , . , ( ) , reference .

  • VMパラメータ
  • -Xmsスタックメモリ最小値
  • -Xmxスタックメモリ最大値
  • -Xossローカルメソッドスタックの大きさですが、実際にはHotSpotではローカルメソッドスタックと仮想マシンメソッドスタックを区別しないので効果はありません.
  • -Xssスタック容量設定
  • -XX:MaxPermSize最大メソッド領域値
  • -XX:PermSizeメソッド領域サイズ