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

2,761 views

Published on

Internal structures of Java objects (oops)

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,761
On SlideShare
0
From Embeds
0
Number of Embeds
49
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

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

×