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 コンパイルによるメソッド実体の差し変え
  はどのクラスの担当?

More Related Content

PPTX
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
PPTX
.NET Core 3.0 で使える C# 8
PDF
20120422i phonedeveloperworkshoppublished
PPTX
大人のお型付け
PDF
C++入門?
PDF
競技プログラミングにおけるコードの書き方とその利便性
PPTX
競技プログラミングのためのC++入門
C++コンパイラ GCCとClangからのメッセージをお読みください
.NET Core 3.0 で使える C# 8
20120422i phonedeveloperworkshoppublished
大人のお型付け
C++入門?
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングのためのC++入門

What's hot (19)

PPTX
ナウなヤングにバカうけのイカしたタグ付き共用体
PDF
Processing
PDF
C++ ポインタ ブートキャンプ
PPTX
PDF
Define and expansion of cpp macro
PDF
君はまだ,本当のプリプロセスを知らない
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PDF
任意粒度機能モデルコードクローン検出手法のリファクタリング理解への適用の試み
PDF
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
PDF
ROS JAPAN Users Group Meetup 01
PDF
Linq To Fun
PDF
templateとautoの型推論
PDF
JavaScript 勉強会 ― 変数・演算子・文
PDF
TypeScript & 関数型講座 第2回 TypeScript という言語
PDF
Cookpad Summer Intern 2015 - Programming Paradigm
PPTX
C# 9 のおすすめ新機能
PDF
Lt8 JavaScriptで配列をコピーする
PDF
Rubyの御先祖CLUのお話(原本)
PDF
Effective Modern C++ 勉強会#1 Item3,4
ナウなヤングにバカうけのイカしたタグ付き共用体
Processing
C++ ポインタ ブートキャンプ
Define and expansion of cpp macro
君はまだ,本当のプリプロセスを知らない
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
任意粒度機能モデルコードクローン検出手法のリファクタリング理解への適用の試み
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
ROS JAPAN Users Group Meetup 01
Linq To Fun
templateとautoの型推論
JavaScript 勉強会 ― 変数・演算子・文
TypeScript & 関数型講座 第2回 TypeScript という言語
Cookpad Summer Intern 2015 - Programming Paradigm
C# 9 のおすすめ新機能
Lt8 JavaScriptで配列をコピーする
Rubyの御先祖CLUのお話(原本)
Effective Modern C++ 勉強会#1 Item3,4
Ad

Viewers also liked (8)

PDF
深層学習フレームワーク Chainer の開発と今後の展開
PDF
Quasar: Actor Model and Light Weight Threads on Java
PDF
金勘定のためのBigDecimalそしてMoney and Currency API
PDF
Javaのログ出力: 道具と考え方
PDF
Graph Algorithms Part 1
PDF
Introduction to DEEPstation the GUI Deep learning environment for chainer
PDF
CuPy解説
PDF
Java SE 9の紹介: モジュール・システムを中心に
深層学習フレームワーク Chainer の開発と今後の展開
Quasar: Actor Model and Light Weight Threads on Java
金勘定のためのBigDecimalそしてMoney and Currency API
Javaのログ出力: 道具と考え方
Graph Algorithms Part 1
Introduction to DEEPstation the GUI Deep learning environment for chainer
CuPy解説
Java SE 9の紹介: モジュール・システムを中心に
Ad

Similar to Java オブジェクトの内部構造 (20)

PDF
詳解Dexファイルフォーマット
PDF
Javaセキュアコーディングセミナー東京第1回 講義
PDF
boost tour 1.48.0 all
PDF
インメモリーで超高速処理を実現する場合のカギ
PPT
Rpscala2011 0601
PDF
Boost Tour 1.50.0 All
PDF
[豆ナイト]Java small object programming
PDF
Boost tour 1_40_0
PDF
JavaWorld Day 2009 Scala
KEY
関ジャバ JavaOne Tokyo 2012報告会
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
Alluren of prototype-based OOP
PDF
Javaにおけるデータシリアライズと圧縮
PPTX
Xtend の紹介
PDF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
ODP
Rubyのソースコードを読んでみよう(入門編)
PDF
Var handles jjug_ccc_spring_2018
PDF
【Unity道場スペシャル 2018京都】プロなら当然!プログラミング技能解説
PPT
JVM-Reading-ParalleGC
詳解Dexファイルフォーマット
Javaセキュアコーディングセミナー東京第1回 講義
boost tour 1.48.0 all
インメモリーで超高速処理を実現する場合のカギ
Rpscala2011 0601
Boost Tour 1.50.0 All
[豆ナイト]Java small object programming
Boost tour 1_40_0
JavaWorld Day 2009 Scala
関ジャバ JavaOne Tokyo 2012報告会
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
Alluren of prototype-based OOP
Javaにおけるデータシリアライズと圧縮
Xtend の紹介
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
Rubyのソースコードを読んでみよう(入門編)
Var handles jjug_ccc_spring_2018
【Unity道場スペシャル 2018京都】プロなら当然!プログラミング技能解説
JVM-Reading-ParalleGC

More from Taku Miyakawa (14)

PDF
Matrix Multiplication in Strassen Algorithm
PDF
擬似乱数生成器の評価
PDF
コルーチンの実装について
PDF
言語設計者が意味論を書くときに考えていたこと
PDF
Kink の宣伝
PDF
ラムダと invokedynamic の蜜月
PDF
Java Quine Golf
PDF
Summary of "Hacking", 0x351-0x354
PDF
Processing LTSV by Apache Pig
PDF
Kink: プロトタイプベースの俺々 JVM 言語
PDF
Kink: invokedynamic on a prototype-based language
PDF
Java 7 invokedynamic の概要
PDF
Hadoop jobbuilder
PDF
Kink: developing a programming language on the JVM
Matrix Multiplication in Strassen Algorithm
擬似乱数生成器の評価
コルーチンの実装について
言語設計者が意味論を書くときに考えていたこと
Kink の宣伝
ラムダと invokedynamic の蜜月
Java Quine Golf
Summary of "Hacking", 0x351-0x354
Processing LTSV by Apache Pig
Kink: プロトタイプベースの俺々 JVM 言語
Kink: invokedynamic on a prototype-based language
Java 7 invokedynamic の概要
Hadoop jobbuilder
Kink: developing a programming language on the JVM

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 コンパイルによるメソッド実体の差し変え はどのクラスの担当?