Java オブジェクトの内部構造

       2011-08-20
  宮川 拓 (@miyakawa_taku)
自己紹介
        名前      宮川 拓
      Twitter   @miyakawa_taku
        職業      SI屋
        仕事      Hadooper
     Java 歴     4年

JVM 上で動くオレオレ言語を作っています
http://code.google.com/p/kink-lang/
問題設定
• Java オブジェクトが JVM 上でどの様な実体
  として表現されているのかが知りたい
 1. Java オブジェクトを表現する構造体
 2. Java オブジェクトに対する参照の持ち方 (フィー
    ルド、一時変数、配列の要素)
 3. Java オブジェクトの作成・破棄の動作
今日読む主なソースコード
• interpreter/bytecodeInterpreter.cpp
  – オブジェクトがどのような構造体として扱われてい
    るかを見る
• oop/oop.hpp
• oop/instanceOop.hpp
  – オブジェクトのメモリイメージを見る
• oop/oop.inline.hpp
  – フィールドへのアクセス方法を見る
oop 実装クラスの階層
oop                      ヒープ上に確保される構造体の総称
  instanceOop            ふつうのクラスのインスタンス
  methodOop              メソッド
  constMethodOop         ?
  methodDataOop          メソッドのプロファイリングデータ
  arrayOop               配列のインスタンス
      objArrayOop        参照型の配列のインスタンス
      typeArrayOop       プリミティブ型の配列のインスタンス
  constantPoolOop        メソッドのコンスタントプール
  constantPoolCacheOop   メソッド実行時情報 (フィールドオフセット等)
  symbolOop              メソッド名、クラス名等の intern 表現
  klassOop               クラス
  markOop                他の oop のメタ情報の一部。GC対象外
  compiledICHolderOop    ?
oop のメモリイメージ
    oopDesc    _mark: markOop /* GCのためのメタ情報 */
               _klass: klassOop /* oop の型 */
xxxOopDesc     oop 実装クラスごとのメンバ変数
後続領域           oop 実装クラスごとの追加情報



                     /* こんなイメージ */
                     typedef struct {
                        int x;
                        int y;
                        char buf[0];
                     } bitmap;
                     bitmap *b = malloc(sizeof(bitmap) + x * y);
                     b->x = x;
                     b->y = y;
                     memcpy(b->buf, buf, x * y);
instanceOop のメモリイメージ
    oopDesc       _mark: markOop /* GCのためのメタ情報 */
                  _klass: klassOop /* oop の型 */
instanceOopDesc   /* 特有のメンバ変数は無し */
後続領域              フィールド群
                   jint num = 42

                   oop title ⇒ “VOXXX!”: java.lang.String

                   oop info = null



                                     フィールドの種類と数は
                                     _klass によって決まる
触れなかった || 分からなかった所
• narrowOop と UseCompressedOops
  – Compressed oops 機能関連
• constMethodOop って何?
  – これはあまり深くなさそう
• compiledICHolderOop って何?
  – JIT コンパイルに絡んでいそう
• JIT コンパイルによるメソッド実体の差し変え
  はどのクラスの担当?

Java オブジェクトの内部構造

  • 1.
    Java オブジェクトの内部構造 2011-08-20 宮川 拓 (@miyakawa_taku)
  • 2.
    自己紹介 名前 宮川 拓 Twitter @miyakawa_taku 職業 SI屋 仕事 Hadooper Java 歴 4年 JVM 上で動くオレオレ言語を作っています http://code.google.com/p/kink-lang/
  • 3.
    問題設定 • Java オブジェクトがJVM 上でどの様な実体 として表現されているのかが知りたい 1. Java オブジェクトを表現する構造体 2. Java オブジェクトに対する参照の持ち方 (フィー ルド、一時変数、配列の要素) 3. Java オブジェクトの作成・破棄の動作
  • 4.
    今日読む主なソースコード • interpreter/bytecodeInterpreter.cpp – オブジェクトがどのような構造体として扱われてい るかを見る • oop/oop.hpp • oop/instanceOop.hpp – オブジェクトのメモリイメージを見る • oop/oop.inline.hpp – フィールドへのアクセス方法を見る
  • 5.
    oop 実装クラスの階層 oop ヒープ上に確保される構造体の総称 instanceOop ふつうのクラスのインスタンス methodOop メソッド constMethodOop ? methodDataOop メソッドのプロファイリングデータ arrayOop 配列のインスタンス objArrayOop 参照型の配列のインスタンス typeArrayOop プリミティブ型の配列のインスタンス constantPoolOop メソッドのコンスタントプール constantPoolCacheOop メソッド実行時情報 (フィールドオフセット等) symbolOop メソッド名、クラス名等の intern 表現 klassOop クラス markOop 他の oop のメタ情報の一部。GC対象外 compiledICHolderOop ?
  • 6.
    oop のメモリイメージ oopDesc _mark: markOop /* GCのためのメタ情報 */ _klass: klassOop /* oop の型 */ xxxOopDesc oop 実装クラスごとのメンバ変数 後続領域 oop 実装クラスごとの追加情報 /* こんなイメージ */ typedef struct { int x; int y; char buf[0]; } bitmap; bitmap *b = malloc(sizeof(bitmap) + x * y); b->x = x; b->y = y; memcpy(b->buf, buf, x * y);
  • 7.
    instanceOop のメモリイメージ oopDesc _mark: markOop /* GCのためのメタ情報 */ _klass: klassOop /* oop の型 */ instanceOopDesc /* 特有のメンバ変数は無し */ 後続領域 フィールド群 jint num = 42 oop title ⇒ “VOXXX!”: java.lang.String oop info = null フィールドの種類と数は _klass によって決まる
  • 8.
    触れなかった || 分からなかった所 •narrowOop と UseCompressedOops – Compressed oops 機能関連 • constMethodOop って何? – これはあまり深くなさそう • compiledICHolderOop って何? – JIT コンパイルに絡んでいそう • JIT コンパイルによるメソッド実体の差し変え はどのクラスの担当?