133
VMの歩む道。 DalvikART、そしてJava VM JJUG CCC 2017 Spring #ccc_a7 #jjug_ccc @yy_yank

VMの歩む道。 Dalvik、ART、そしてJava VM

  • Upload
    yy-yank

  • View
    6.725

  • Download
    0

Embed Size (px)

Citation preview

Page 1: VMの歩む道。 Dalvik、ART、そしてJava VM

VMの歩む道。Dalvik、ART、そしてJava VM

JJUG CCC 2017 Spring #ccc_a7 #jjug_ccc@yy_yank

Page 2: VMの歩む道。 Dalvik、ART、そしてJava VM

#ccc_a7 #jjug_cccでつぶやいてください

ハッシュタグ

Page 3: VMの歩む道。 Dalvik、ART、そしてJava VM

自己紹介

やんく(@yy_yank)        こいつです

        ・JJUG CCC登壇3回目

        ・vi好き

        ・でもサクラエディタicon        ・JavaとKotlinが好き

Page 4: VMの歩む道。 Dalvik、ART、そしてJava VM

質問です!!

Page 5: VMの歩む道。 Dalvik、ART、そしてJava VM

JVM初心者ですか?僕より詳しくないですか?

Question1

Page 6: VMの歩む道。 Dalvik、ART、そしてJava VM

Android開発したことがありますか?

Question2

Page 7: VMの歩む道。 Dalvik、ART、そしてJava VM

サーバーサイドをJavaで開発したことが

ありますか?

Question3

Page 8: VMの歩む道。 Dalvik、ART、そしてJava VM

・VMにチョットクワシクナル(not エキスパート)・VMの比較対象を増やす

・知らずに批評をしない、知ってる知識をベースにフェアになる

本セッションのゴール

Page 9: VMの歩む道。 Dalvik、ART、そしてJava VM

・Oracle vs Google・Apache Harmonyの細かい話

過去のJJUGナイトセミナーのこの内容を読むと良いと思います。

http://www.publickey1.jp/blog/16/googleoraclejava_apiitjjug.html

本セッションで話題にしないこと

Page 10: VMの歩む道。 Dalvik、ART、そしてJava VM

・実践的なVMのパフォーマンスチューニング

Javaパフォーマンスという

本があるので

それを読んでいただければ

おそらく・・・!

本セッションで話題にしないこと

Page 11: VMの歩む道。 Dalvik、ART、そしてJava VM

アジェンダ

1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not Dalvik/ART)3.こんなに違う、マシン命令

4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ

Page 12: VMの歩む道。 Dalvik、ART、そしてJava VM

アジェンダ

▷ 1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not Dalvik/ART)3.こんなに違う、マシン命令

4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ

Page 13: VMの歩む道。 Dalvik、ART、そしてJava VM

・別に知らなくていい(身も蓋もない)

・知ってた方がプラットフォームを意識した設計・プログラミングが出来るのでは

・HotSpot以外のVMを知ってた方が翻ってHotSpotの理解につながるのでは

1. Javaの人にとってのDalvik/ART

Page 14: VMの歩む道。 Dalvik、ART、そしてJava VM

☆今更ながら前提

・現状Oracleの提供するJVM = HotSpot・AndroidのVM = ART(昔はDalvik)・それぞれダルビック、アートと読む

ARTはDalvikがベースとなっている

1. Javaの人にとってのDalvik/ART

Page 15: VMの歩む道。 Dalvik、ART、そしてJava VM

Q.HotSpot VM以外無いの?

A.あります

・HotSpotは(元Sun、現Oracle所有)・IBM J9 VM(IBM)・JRockit(元BEA、現Oracle所有)など

1. Javaの人にとってのDalvik/ART

Page 16: VMの歩む道。 Dalvik、ART、そしてJava VM

Q.HotSpot VM以外無いの?

A.あります

・HotSpotは(元Sun、現Oracle所有)・IBM J9 VM(IBM)・JRockit(元BEA、現Oracle所有)など

1. Javaの人にとってのDalvik/ART

とても大胆に分けてしまうと、大体の人はHotSpotを使っていて、JVMの処理系を意識していないものと思います

Page 17: VMの歩む道。 Dalvik、ART、そしてJava VM

1. Javaの人にとってのDalvik/ART

◯JRockit・・・1.6までしかない。1.7でHotSpotと統合されたようです

◯J9 VM・・・Websphere、DB2などで利用されてきました。Open J9というプロジェクトもありアクティブですが、シェアはHotSpotが多いと思われます

Page 18: VMの歩む道。 Dalvik、ART、そしてJava VM

◯JRockit・・・1.6までしかない。1.7でHotSpotと統合されたようです

◯J9 VM・・・Websphere、DB2などで利用されてきました。Open J9というプロジェクトもありアクティブですが、シェアはHotSpotが多いと思われます

1. Javaの人にとってのDalvik/ART

ということで、本セッションではHotSpot、Dalvik/ARTを中心に話をします

Page 19: VMの歩む道。 Dalvik、ART、そしてJava VM

1. Javaの人にとってのDalvik/ART

cf. J9 VMの情報は以下が詳しい

IBM SDK for Java 8の全貌

https://www.slideshare.net/takakiyo/jjugccc-201ibm-sdk-for-java-8

Page 20: VMの歩む道。 Dalvik、ART、そしてJava VM

アジェンダ

1. Javaの人にとってのDalvik/ART▷2.Androidの人にとってのJVM(not Dalvik/ART)3.こんなに違う、マシン命令

4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ

Page 21: VMの歩む道。 Dalvik、ART、そしてJava VM

・JavaもどきとかAndroid Javaとはなぜ言う人がいるか(またそれに対しての対応)

・違いを知る。実機では動かないけどIDEでは動く、なぜ?とか

・なぜHotSpotがあるのにAndroidはVMを独自に用意した?

2.Androidの人にとってのJVM

Page 22: VMの歩む道。 Dalvik、ART、そしてJava VM

・言葉が悪い

・JavaであってちょっとJavaでなくてちょっとJavaなのがAndroid・Android Javaぐらいが妥当な表現か

Javaもどき問題

Page 23: VMの歩む道。 Dalvik、ART、そしてJava VM

Javaもどき問題

・JLSは満たしているようだが、

JVMSは満たしていない

(歴史的経緯でTCKをパスしていない)・標準ライブラリが違う

例えばjava.beansパッケージに含まれているクラスが少ないなど

Page 24: VMの歩む道。 Dalvik、ART、そしてJava VM

アジェンダ

1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not Dalvik/ART)▷ 3.こんなに違う、マシン命令

4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ

Page 25: VMの歩む道。 Dalvik、ART、そしてJava VM

ちょっとその前に

Page 26: VMの歩む道。 Dalvik、ART、そしてJava VM

・HotSpotはスタックマシン

・Dalvik/ARTは(特殊な)レジスタマシン

スタックマシンは命令を積み上げ

レジスタマシンは命令をレジスタへの登録

Dalvik/ARTの場合はメモリ領域をレジスタと呼んでいる(特殊とはそのあたりのこと)

3.こんなに違う、マシン命令

Page 27: VMの歩む道。 Dalvik、ART、そしてJava VM

・HotSpotはスタックマシン

・Dalvik/ARTは(特殊な)レジスタマシン

スタックマシンは命令を積み上げ

レジスタマシンは命令をレジスタへの登録

Dalvik/ARTの場合はメモリ領域をレジスタと呼んでいる(特殊とはそのあたりのこと)

3.こんなに違う、マシン命令

そもそもマシンのモデルが違った

Page 28: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:スタックマシン

3.こんなに違う、マシン命令

メモリ

スタック

Page 29: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:スタックマシン

3.こんなに違う、マシン命令

メモリ

1スタック

1をPUSH

Page 30: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:スタックマシン

3.こんなに違う、マシン命令

メモリ

スタック

2をPUSH

Page 31: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:スタックマシン

3.こんなに違う、マシン命令

メモリ

1スタック

2をPOP

Page 32: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:スタックマシン

3.こんなに違う、マシン命令

メモリ

スタック

1をPOP

Page 33: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:スタックマシン

3.こんなに違う、マシン命令

メモリ

3スタック

POPした1 と 2を加算してPUSH

Page 34: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:レジスタマシン

3.こんなに違う、マシン命令

メモリ

レジスタ

R0

R1

R2

R3

Page 35: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:レジスタマシン

3.こんなに違う、マシン命令

メモリ

1レジスタ

R0

R1

R2

R3

R0に1を登録

Page 36: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:レジスタマシン

3.こんなに違う、マシン命令

メモリ

1

2

レジスタ

R0

R1

R2

R3

R1に2を登録

Page 37: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:レジスタマシン

3.こんなに違う、マシン命令

メモリ

1

2

3(R0 + R1)

レジスタ

R0

R1

R2

R3

R2にR0+R1を登録

Page 38: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:Dalvik/ARTのレジスタマシン

3.こんなに違う、マシン命令

メモリ

メソッドB

メソッドB

メソッドA

メソッドA

レジスタ

R1

R0

R1

R0

Page 39: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:Dalvik/ARTのレジスタマシン

3.こんなに違う、マシン命令

メモリ

メソッドB

メソッドB

メソッドA

メソッドA

レジスタ

R1

R0

R1

R0

メソッドごとにスタック。でもレジスタマシン。

Page 40: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:Dalvik/ARTのレジスタマシン

3.こんなに違う、マシン命令

メモリ

メソッドB

メソッドB

メソッドA

メソッドA

レジスタ

R1

R0

R1

R0

レジスタと言いつつ演算用のメモリ領域に確保している

Page 41: VMの歩む道。 Dalvik、ART、そしてJava VM

簡略例:Dalvik/ARTのレジスタマシン

3.こんなに違う、マシン命令

メモリ

メソッドB

メソッドB

メソッドA

メソッドA

レジスタ

R1

R0

R1

R0

むずかしい!?

Page 42: VMの歩む道。 Dalvik、ART、そしてJava VM

このスライドが詳しいです。

Dalvik仮想マシンのアーキテクチャ 改訂版

https://www.slideshare.net/kmt-t/dalvik-10316622というかTakuya Matsunagaという方がすごい

3.こんなに違う、マシン命令

Page 43: VMの歩む道。 Dalvik、ART、そしてJava VM

なんで違う?

HotSpotはスタックマシン

・ハードウェアを問わず動かしやすいアーキテクチャ

・Run Anywhere的なところを優先した結果なのか・・・?

3.こんなに違う、マシン命令

Page 44: VMの歩む道。 Dalvik、ART、そしてJava VM

☆なんで違う?

Dalvik/ARTは(特殊な)レジスタマシン

・instruction dispatchを避けたかった

・不要なメモリアクセスを避けたかった

・命令処理の流れを素早くさばきたい

3.こんなに違う、マシン命令

Page 45: VMの歩む道。 Dalvik、ART、そしてJava VM

☆なんで違う?

Dalvik/ARTは(特殊な)レジスタマシン

・instruction dispatchを避けたかった

・不要なメモリアクセスを避けたかった

・命令処理の流れを素早くさばきたい

3.こんなに違う、マシン命令

・instruction dispatchとはメモリからの命令のフェッチや読み込み、ジャンプなどなど

Page 46: VMの歩む道。 Dalvik、ART、そしてJava VM

やっとマシン命令の話

Page 47: VMの歩む道。 Dalvik、ART、そしてJava VM

3.こんなに違う、マシン命令

・HotSpotマシン命令の一例

invokevirtual = インスタンスのメソッド呼び出しinvokeinterface = interfaceのメソッド呼び出しinvokestatic = staticメソッドの呼び出しinvokespecial = コンストラクタの呼び出し

よく見るやつですね

Page 48: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTマシン命令の一例

invoke-virtual = インスタンスのメソッド呼び出し

invoke-interface = interfaceのメソッド呼び出し

invoke-static = staticメソッドの呼び出し

new-instance = インスタンスの生成

3.こんなに違う、マシン命令

Page 49: VMの歩む道。 Dalvik、ART、そしてJava VM

大体一緒やん

Page 50: VMの歩む道。 Dalvik、ART、そしてJava VM

いえいえ、違うところも…

Page 51: VMの歩む道。 Dalvik、ART、そしてJava VM

3.こんなに違う、マシン命令

・HotSpotマシン命令の一例

invokevirtual = 0xb6invokeinterface = 0xb7invokestatic =0xb8invokespecial = 0xb9

Page 52: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTマシン命令の一例

invoke-virtual = 0x6einvoke-interface = 0x72invoke-static = 0x71new-instance = 0x22

3.こんなに違う、マシン命令

Page 53: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTマシン命令の一例

invoke-virtual = 0x6einvoke-interface = 0x72invoke-static = 0x71new-instance = 0x22オペコードの値は違う(そりゃそうか)

3.こんなに違う、マシン命令

Page 54: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTとHotSpotでどちらにもあるもの

return系命令

const系命令

if系命令

などなど。

3.こんなに違う、マシン命令

Page 55: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTとHotSpotでどちらにもあるもの

return系命令

const系命令

if系命令

などなど。

3.こんなに違う、マシン命令HotSpot: ireturn(0xac) lreturn(0xad) freturn(0xae)Dalvik/ART: return-void(0x0e) return (0x0f) return-wide(0x10) return-object(0x11)

Page 56: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTとHotSpotでどちらにもあるもの

return系命令

const系命令

if系命令

などなど。

3.こんなに違う、マシン命令HotSpot: iconst_ほげほげ lconst_ほげほげ dconst_ほげほげDalvik/ART: const/4 const/16 const

Page 57: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTとHotSpotでどちらにもあるもの

return系命令

const系命令

if系命令

などなど。

3.こんなに違う、マシン命令

などなど・・・。(気になる人は命令セットを比較してみて下さい)

Page 58: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTとHotSpotでどちらにもあるもの

return系命令

const系命令

if系命令

などなど。

3.こんなに違う、マシン命令

命令の名称やオペコードの値は色々違っているのだけど、大体やる処理としては同じ

Page 59: VMの歩む道。 Dalvik、ART、そしてJava VM

・Dalvik/ARTにしかなさそうなもの

move命令

->レジスタペアを別のレジスタに移動

invoke-polymophicとinvoke-custom->Androidの8.0から新しく使えるようになるオペコード。MethodHandleを呼び出すのだとか・・!

3.こんなに違う、マシン命令

Page 60: VMの歩む道。 Dalvik、ART、そしてJava VM

3.こんなに違う、マシン命令

・こんなに違う、は主にVMのマシンアーキテクチャだった

・それにともなって、マシン命令も違う(というより、オペコードの値は違う)

・実行バイナリが違うことも1つ大きな要因だと思います(この後に紹介します)

Page 61: VMの歩む道。 Dalvik、ART、そしてJava VM

アジェンダ

1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not dalvik/ART)3.こんなに違う、マシン命令

▷ 4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ

Page 62: VMの歩む道。 Dalvik、ART、そしてJava VM

4.バイナリ(class、dex)

・HotSpotはclassファイル

・Dalvik/ARTはdex(Dalvik Executable)ファイル

がそれぞれVMにロードされて

マシンコードになって実行される

Page 63: VMの歩む道。 Dalvik、ART、そしてJava VM

4.バイナリ(class、dex)ソースコード(javaファイル)

dexツール dexファイル

HotSpot VM Dalvik/ART VM

classファイル

Page 64: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

1.magic;2.minor_version;3.major_version;4.constant_pool_count;5.cp_info constant_pool[constant_pool_count-1];

4.バイナリ(class、dex)

Page 65: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

1.magic;2.minor_version;3.major_version;4.constant_pool_count;5.cp_info constant_pool[constant_pool_count-1];

4.バイナリ(class、dex)

いわゆるひとつのCAFEBABE.classに必ずあるもの

Page 66: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

1.magic;2.minor_version;3.major_version;4.constant_pool_count;5.cp_info constant_pool[constant_pool_count-1];

4.バイナリ(class、dex)

クラスファイルのversion

Page 67: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

1.magic;2.minor_version;3.major_version;4.constant_pool_count;5.cp_info constant_pool[constant_pool_count-1];

4.バイナリ(class、dex)

定数プールのカウント

Page 68: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

1.magic;2.minor_version;3.major_version;4.constant_pool_count;5.cp_info constant_pool[constant_pool_count-1];

4.バイナリ(class、dex)

定数プール

Page 69: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

7.access_flags;8.this_class;9.super_class;10.interfaces_count;11.interfaces[interfaces_count];12.fields_count;13.field_info fields[fields_count];

4.バイナリ(class、dex)

クラスやフィールドへのアクセスフラグ。publicとかprivateとかアレ

Page 70: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

7.access_flags;8.this_class;9.super_class;10.interfaces_count;11.interfaces[interfaces_count];12.fields_count;13.field_info fields[fields_count];

4.バイナリ(class、dex)

このクラス自身と継承しているスーパークラスの情報

Page 71: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

7.access_flags;8.this_class;9.super_class;10.interfaces_count;11.interfaces[interfaces_count];12.fields_count;13.field_info fields[fields_count];

4.バイナリ(class、dex)

interfaceのカウントとintefefaceの配列

Page 72: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

7.access_flags;8.this_class;9.super_class;10.interfaces_count;11.interfaces[interfaces_count];12.fields_count;13.field_info fields[fields_count];

4.バイナリ(class、dex)

フィールドのカウントとフィールドの配列

Page 73: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

14.methods_count;15.method_info methods[methods_count];16.attributes_count;17.attribute_info attributes[attributes_count];

4.バイナリ(class、dex)

Page 74: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

14.methods_count;15.method_info methods[methods_count];16.attributes_count;17.attribute_info attributes[attributes_count];

4.バイナリ(class、dex)

メソッドのカウントとメソッドの配列

Page 75: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

14.methods_count;15.method_info methods[methods_count];16.attributes_count;17.attribute_info attributes[attributes_count];

4.バイナリ(class、dex)

attributeという特殊なもののカウントとその配列

Page 76: VMの歩む道。 Dalvik、ART、そしてJava VM

簡単ですね(?)

Page 77: VMの歩む道。 Dalvik、ART、そしてJava VM

☆classファイルフォーマット

・versioningされている

・情報ごとにカウントを持っている

・各情報の配列を持つ

・アクセシビリティの情報も持つ

・ただしバイナリを直接読むのは辛いし

javapで良い気がする

4.バイナリ(class、dex)

Page 78: VMの歩む道。 Dalvik、ART、そしてJava VM

続いてdex

Page 79: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

1.header 2.string ids 3.type ids 4.proto_ids 5.field_ids 6.method_ids 7.class_defs

4.バイナリ(class、dex)

Page 80: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

1.header 2.string ids 3.type ids 4.proto_ids 5.field_ids 6.method_ids 7.class_defs

4.バイナリ(class、dex)

ヘッダー情報

Page 81: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

1.header 2.string ids 3.type ids 4.proto_ids 5.field_ids 6.method_ids 7.class_defs

4.バイナリ(class、dex)

文字列定数のID

Page 82: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

1.header 2.string ids 3.type ids 4.proto_ids 5.field_ids 6.method_ids 7.class_defs

4.バイナリ(class、dex)

型情報のID

Page 83: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

1.header 2.string ids 3.type ids 4.proto_ids 5.field_ids 6.method_ids 7.class_defs

4.バイナリ(class、dex)

メソッドのプロトタイプ情報のID(DEXでのテンプレート)

Page 84: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

1.header 2.string ids 3.type ids 4.proto_ids 5.field_ids 6.method_ids 7.class_defs

4.バイナリ(class、dex)

フィールド情報のID

Page 85: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

1.header 2.string ids 3.type ids 4.proto_ids 5.field_ids 6.method_ids 7.class_defs

4.バイナリ(class、dex)

メソッド情報のID

Page 86: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

1.header 2.string ids 3.type ids 4.proto_ids 5.field_ids 6.method_ids 7.class_defs

4.バイナリ(class、dex)

クラス定義リスト

Page 87: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

8.call_site_ids 9.method_handles 10.data 11.link_data

4.バイナリ(class、dex)

Page 88: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

8.call_site_ids 9.method_handles 10.data 11.link_data

4.バイナリ(class、dex)

全てcall siteの参照情報(call siteはメソッドの場所的なもの)

Page 89: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

8.call_site_ids 9.method_handles 10.data 11.link_data

4.バイナリ(class、dex)

ハンドリングするメソッドのリスト

Page 90: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

8.call_site_ids 9.method_handles 10.data 11.link_data

4.バイナリ(class、dex)

全部のデータテーブルを持つ

Page 91: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

8.call_site_ids 9.method_handles 10.data 11.link_data

4.バイナリ(class、dex)

静的リンクされた情報

Page 92: VMの歩む道。 Dalvik、ART、そしてJava VM

☆dexファイルフォーマット

・基本的に持っている情報は同じ

(身も蓋もない)・ただ並び順も持ち方も違う

・もちろんそれぞれのバイトコードは

それぞれのVMでしか動かない

4.バイナリ(class、dex)

Page 93: VMの歩む道。 Dalvik、ART、そしてJava VM

アジェンダ

1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not dalvik/ART)3.こんなに違う、マシン命令

4.バイナリ(class、dex)▷ 5.ランタイムごとのAOT、JIT、GC6.まとめ

Page 94: VMの歩む道。 Dalvik、ART、そしてJava VM

・JIT(Just-In-Time Compiler)とは

実行時にネイティブコードにコンパイルする

・AOT(Ahead-Of-Time Compiler)とは

実行前にネイティブコードにコンパイルする

・GCとは

ガベージコレクション。JavaもAndroidも共通のメモリ管理の機構

5.ランタイムごとのAOT、JIT、GC

Page 95: VMの歩む道。 Dalvik、ART、そしてJava VM

・JIT(Just-In-Time Compiler)とは

実行時にネイティブコードにコンパイルする

・AOT(Ahead-Of-Timeコンパイラ)とは

実行前にネイティブコードにコンパイルする

・GCとは

ガベージコレクション。JavaもAndroidも共通のメモリ管理の機構

5.ランタイムごとのAOT、JIT、GC

本来、AOT、JITとGCを並べるのは変な感じですが、資料の構成上並べて紹介する形とします

Page 96: VMの歩む道。 Dalvik、ART、そしてJava VM

・HotSpotでJITが動いてるかどうか

->だいたい動いてる

・ホットなスポットだけJITする

・起動時にvm optionに -XX:+PrintCompilation って付けるとめっちゃJITされたログが出てくる

・-Djava.compiler=none を付け加えるとJITが無効になって何もログが出なくなる

5.ランタイムごとのAOT、JIT、GC

Page 97: VMの歩む道。 Dalvik、ART、そしてJava VM

☆JITの場合(HotSpot)ぼく「javac Hello.java」ぼく「java Hello」HotSpot「メソッド実行前にチェックします」

HotSpot「これはネイティブコードにしときますね〜」

5.ランタイムごとのAOT、JIT、GC

Page 98: VMの歩む道。 Dalvik、ART、そしてJava VM

☆JITの場合(Dalvik)ぼく「アプリインストールした。」

ぼく「起動してみよう」

Dalvik「メソッド実行前にチェックします」

Dalvik「これはネイティブコードにしときますね〜」

5.ランタイムごとのAOT、JIT、GC

Page 99: VMの歩む道。 Dalvik、ART、そしてJava VM

☆AOTの場合(ART)ぼく「アプリインストールしよっと」

ART「あ、これインストール中でもネイティブコードに出来ますわー」

ART「ネイティブコードにしときますね〜」

ぼく「よし、インストール出来た。使ってみよ」

5.ランタイムごとのAOT、JIT、GC

Page 100: VMの歩む道。 Dalvik、ART、そしてJava VM

☆AOTの場合(ART)ぼく「アプリインストールしよっと」

ART「あ、これインストール中でもネイティブコードに出来ますわー」

ART「ネイティブコードにしときますね〜」

ぼく「よし、インストール出来た。使ってみよ」

実行時のオーバーヘッドが少ない!!!

5.ランタイムごとのAOT、JIT、GC

Page 101: VMの歩む道。 Dalvik、ART、そしてJava VM

Google IO 2014 the ART Runtimeより

Page 102: VMの歩む道。 Dalvik、ART、そしてJava VM

ココ!!!

Google IO 2014 the ART Runtimeより

Page 103: VMの歩む道。 Dalvik、ART、そしてJava VM

☆JIT or AOTについて

・HotSpotはJIT/Interpreterを採用

・Dalvik(Android 5.0以前)まではJIT/Interpreter・ART以降(Android 5.0)はAOTを利用している

5.ランタイムごとのAOT、JIT、GC

Page 104: VMの歩む道。 Dalvik、ART、そしてJava VM

☆JIT or AOTについて

・HotSpotはJIT/Interpreterを採用

・Dalvik(Android 5.0以前)まではJIT・ART以降(Android 5.0)はAOTを利用している

5.ランタイムごとのAOT、JIT、GCAndroid 5.0は2014年から

Page 105: VMの歩む道。 Dalvik、ART、そしてJava VM

☆JIT or AOTについて

・HotSpotはJIT/Interpreterを採用

・Dalvik(Android 5.0以前)まではJIT・ART以降(Android 5.0)はAOTを利用している

5.ランタイムごとのAOT、JIT、GCAOTJITInterpreterを選べる

Page 106: VMの歩む道。 Dalvik、ART、そしてJava VM

☆JIT or AOTについて

・HotSpotはJIT/Interpreterを採用

・Dalvik(Android 5.0以前)まではJIT・ART以降(Android 5.0)はAOTを利用している

Android 7.0からはAOT + JITという形に

5.ランタイムごとのAOT、JIT、GCAOTJITInterpreterを選べる

Page 107: VMの歩む道。 Dalvik、ART、そしてJava VM

どういうことか

Page 108: VMの歩む道。 Dalvik、ART、そしてJava VM

☆Android 5.0のARTぼく「アプリインストールしよっと」

ART「あ、これインストール中でもネイティブコードに出来ますわー」

ぼく「インストールめっちゃ長い。電池消費やばい。もうマヂムリ」

(ということもあったらしい)

5.ランタイムごとのAOT、JIT、GC

Page 109: VMの歩む道。 Dalvik、ART、そしてJava VM

Google IO 2016The Evolution of ARTより

Page 110: VMの歩む道。 Dalvik、ART、そしてJava VM

☆Android 7.0のAOT + JITぼく「アプリインストールしよっと」

ART「あ、これインストール中でもネイティブコードに出来ますわー。でも電池消費するからちょっとだけ。あとはJITさんに任せますわ」

ぼく「よしインストール出来たし、アプリ使ってみよっと」

5.ランタイムごとのAOT、JIT、GC

Page 111: VMの歩む道。 Dalvik、ART、そしてJava VM

☆Android 7.0のAOT + JITぼく「アプリインストールしよっと」

ART「あ、これインストール中でもネイティブコードに出来ますわー。でも電池消費するからちょっとだけ。あとはJITさんに任せますわ」

ぼく「よしインストール出来たし、アプリ使ってみよっと」->ユーザーのストレスが少ない形に

5.ランタイムごとのAOT、JIT、GC

Page 112: VMの歩む道。 Dalvik、ART、そしてJava VM

DalvikとARTの違いはこのあたり

・そもそもDalvikはシングルコア向けに作られていた

・Androidは8コアになった。だからART・スイープのpauseがARTの方が短くなったらしい

・dexファイルが動く、など基本的なところは同じ

・違いはAOTが入ったこと、GC改善、ロギング改善など

5.ランタイムごとのAOT、JIT、GC

Page 113: VMの歩む道。 Dalvik、ART、そしてJava VM

???「なるほど。AOTいいんじゃない?」

Page 114: VMの歩む道。 Dalvik、ART、そしてJava VM

???「HotSpotでやれば良いじゃないか」

Page 115: VMの歩む道。 Dalvik、ART、そしてJava VM

☆HotSpotのAOT

・・・・・・・・・・・・・。

5.ランタイムごとのAOT、JIT、GC

Page 116: VMの歩む道。 Dalvik、ART、そしてJava VM

☆HotSpotのAOT

あると思います!!!!

5.ランタイムごとのAOT、JIT、GC

Page 117: VMの歩む道。 Dalvik、ART、そしてJava VM

HotSpotのAOT

Page 118: VMの歩む道。 Dalvik、ART、そしてJava VM

HotSpotのAOT

Page 119: VMの歩む道。 Dalvik、ART、そしてJava VM

HotSpotのAOT

Page 120: VMの歩む道。 Dalvik、ART、そしてJava VM

☆JEP295

・Java 9では入らない

・javaコマンドオプションでAOTライブラリを指定

・It uses Graal as the code-generating backend.

5.ランタイムごとのAOT、JIT、GC

Page 121: VMの歩む道。 Dalvik、ART、そしてJava VM

☆Graalとは

・Next generation compilation technology supporting Java, Ruby, R, JavaScript, LLVM, and more...

というJavaで書かれてるヤバいやつ

5.ランタイムごとのAOT、JIT、GC

Page 122: VMの歩む道。 Dalvik、ART、そしてJava VM

99%Javaです!

5.ランタイムごとのAOT、JIT、GC

Page 123: VMの歩む道。 Dalvik、ART、そしてJava VM

つづいてGC!

Page 124: VMの歩む道。 Dalvik、ART、そしてJava VM

☆GCについて

HotSpotだと

・シリアル GC・パラレル GC・CMS GC(Java 9でdeprecated?)・G1GC(Java 9でデフォルト?)ココから選ぶことになる

5.ランタイムごとのAOT、JIT、GC

Page 125: VMの歩む道。 Dalvik、ART、そしてJava VM

5.ランタイムごとのAOT、JIT、GC

☆ARTだと

dalvik.vm.gctypeプロパティを変更するか、-Xgcオプションで

・CMS GC(デフォルト)・Semi Space GC(いわゆるコピーGC)・Generational Semi Space GC(いわゆるコピーGC)

Page 126: VMの歩む道。 Dalvik、ART、そしてJava VM

5.ランタイムごとのAOT、JIT、GC

☆ARTだと

dalvik.vm.gctypeプロパティを変更するか、-Xgcオプションで

・CMS GC(デフォルト)・Semi Space GC(いわゆるコピーGC)・Generational Semi Space GC(いわゆるコピーGC)

可動オブジェクトを動かす空間と非可動オブジェクトの空間を持つ。移動させてシュッとGC

Page 127: VMの歩む道。 Dalvik、ART、そしてJava VM

5.ランタイムごとのAOT、JIT、GC

☆ARTだと

dalvik.vm.gctypeプロパティを変更するか、-Xgcオプションで

・CMS GC(デフォルト)・Semi Space GC(いわゆるコピーGC)・Generational Semi Space GC(いわゆるコピーGC)

こっちはそれを世代別に

Page 128: VMの歩む道。 Dalvik、ART、そしてJava VM

5.ランタイムごとのAOT、JIT、GCDalvik

Google IO 2014 the ART Runtimeより

Page 129: VMの歩む道。 Dalvik、ART、そしてJava VM

5.ランタイムごとのAOT、JIT、GCART

Google IO 2014 the ART Runtimeより

Page 130: VMの歩む道。 Dalvik、ART、そしてJava VM

アジェンダ

1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not dalvik/ART)3.こんなに違う、マシン命令

4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC▷ 6.まとめ

Page 131: VMの歩む道。 Dalvik、ART、そしてJava VM

なんのためのDalvik、ARTか・Androidに最適化されている

・ARTは最近?のAndroid端末に合わせての更なる最適化・当たり前だがプラットフォームが違えば要求される実行環境(VM)も違う

・プラットフォームを優先した結果独自VMとして別々の道を歩むことになった

6.まとめ

Page 132: VMの歩む道。 Dalvik、ART、そしてJava VM

・プラットフォームに合わせるために犠牲はつきもの?

->Android SDKに無くて、JDKにあるものはあるが、バランスを考えてそうなっている

・どちらも頑張った結果

->HotSpotはPCマシン(あるいはサーバー)前提で最適化を頑張った結果、Dalvik/ARTはAndroidプラットフォーム前提で頑張った結果

6.まとめ

Page 133: VMの歩む道。 Dalvik、ART、そしてJava VM

・VMをブラックボックスとして扱う技術者にならないように(自戒を込めて)・どう動いているのか意識して、その上でIDEに任せて楽をしたい

・何が起こってるか理解できないと問題を解決できない

6.まとめ