2. In od on
Hiroshi Saito @saidie
➔ SmartNews 1.5yrs
広告配信プラットフォーム (Java)
➔ DeNA 3yrs
Web サーバサイド (Perl, Ruby on Rails)
➔ Ph.D Student 5yrs
理論神経科学
Java 初心者!!
20. share/oops/ にある C++ の class
● Klass ⇐ Java のクラス/interface
○ ex) Object クラスの Klass, Integer クラスの Klass
● ConstantPool
○ ある Klass から参照される定数のルックアップテーブル
○ Klass*の配列を持っている
Div I J
基本的なデータ構造
21. Div I J
バイトコードインタプリタ概要
1. pc の位置にある命令を読む
2. バイトコードに応じて処理を行う
○ 巨大な switch 文
3. pc を更新する
4. 1 に戻る
(実際にはスレッデッドコード)
概念図
pc next pc
bytecode
26. Div I J
Fast and Decisive Class Checking in the Hotspot VM
John Rose & Cliff Click, 2001
以下のような思想の下で考案された
● CPU のオペレーションを少なくしたい
● Memory access を少なくしたい
● VM call をなくしたい
Klass.hpp にあるとあるコメント
27. Div I J
subtype check 継承の場合
単純にsuper classを一つ一つチェックする場合
深さに応じた時間がかかる
31. Div I J
Binary matrix
Klass に連番をつけて binary matrix を作る
クラスの動的load/unloadへの対応が難しい
Serializable Collection Iterable List Set
Integer o
AbstractSet o o o o
AbstractList o o o o
HashSet o o o o
ArrayList o o o o
32. Div I J
線形探索 + Cache
● 数がそんなに多くなければそれほど遅くない
● 前回のinstanceofで参照されたクラスをキャッシュし
ておき、次回は最初にキャッシュをチェックする
CollectionSerializable Iterable ListCloneable RandomAccess
ArrayList の secondary supers
33. Div I J
ここまでのまとめ
● クラスに対する is_subtype_of
○ 継承ツリーにおける深さで一発で求められる
● interfaceに対する is_subtype_of
○ 前回ヒットしたクラスをチェックする
○ チェックが失敗したら線形探索
36. Div I J
● super_depthはクラスロード時に確定する
● どちらの条件を使うかも確定する
範囲チェックと T との比較を一括で実現できる
load時に決まる
37. Div I J
Klassのメモリレイアウト
0 1 2 3 4 5 6 7 8 9 A B C D E F
Layout helper Klass ID
Super Check
Offset
Symbol*
name
Array<Klass*>*
Secondary Supers
Klass*
Secondary Super
Cache
Klass*
Primary Supers[0]
super depth < 88 <= super depth
Klass*
Primary Supers[1]
Klass*
Primary Supers[6]
Klass*
Primary Supers[7]
参照すべきメモリ位置が事前に分かる!