VMの歩む道。 Dalvik、ART、そしてJava VM
-
Upload
yy-yank -
Category
Technology
-
view
6.726 -
download
0
Transcript of VMの歩む道。 Dalvik、ART、そしてJava VM
![Page 1: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/1.jpg)
VMの歩む道。Dalvik、ART、そしてJava VM
JJUG CCC 2017 Spring #ccc_a7 #jjug_ccc@yy_yank
![Page 2: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/2.jpg)
#ccc_a7 #jjug_cccでつぶやいてください
ハッシュタグ
![Page 3: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/3.jpg)
自己紹介
やんく(@yy_yank) こいつです
・JJUG CCC登壇3回目
・vi好き
・でもサクラエディタicon ・JavaとKotlinが好き
![Page 4: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/4.jpg)
質問です!!
![Page 5: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/5.jpg)
JVM初心者ですか?僕より詳しくないですか?
Question1
![Page 6: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/6.jpg)
Android開発したことがありますか?
Question2
![Page 7: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/7.jpg)
サーバーサイドをJavaで開発したことが
ありますか?
Question3
![Page 8: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/8.jpg)
・VMにチョットクワシクナル(not エキスパート)・VMの比較対象を増やす
・知らずに批評をしない、知ってる知識をベースにフェアになる
本セッションのゴール
![Page 9: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/9.jpg)
・Oracle vs Google・Apache Harmonyの細かい話
過去のJJUGナイトセミナーのこの内容を読むと良いと思います。
http://www.publickey1.jp/blog/16/googleoraclejava_apiitjjug.html
本セッションで話題にしないこと
![Page 10: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/10.jpg)
・実践的なVMのパフォーマンスチューニング
Javaパフォーマンスという
本があるので
それを読んでいただければ
おそらく・・・!
本セッションで話題にしないこと
![Page 11: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/11.jpg)
アジェンダ
1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not Dalvik/ART)3.こんなに違う、マシン命令
4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ
![Page 12: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/12.jpg)
アジェンダ
▷ 1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not Dalvik/ART)3.こんなに違う、マシン命令
4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ
![Page 13: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/13.jpg)
・別に知らなくていい(身も蓋もない)
・知ってた方がプラットフォームを意識した設計・プログラミングが出来るのでは
・HotSpot以外のVMを知ってた方が翻ってHotSpotの理解につながるのでは
1. Javaの人にとってのDalvik/ART
![Page 14: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/14.jpg)
☆今更ながら前提
・現状Oracleの提供するJVM = HotSpot・AndroidのVM = ART(昔はDalvik)・それぞれダルビック、アートと読む
ARTはDalvikがベースとなっている
1. Javaの人にとってのDalvik/ART
![Page 15: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/15.jpg)
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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/16.jpg)
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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/17.jpg)
1. Javaの人にとってのDalvik/ART
◯JRockit・・・1.6までしかない。1.7でHotSpotと統合されたようです
◯J9 VM・・・Websphere、DB2などで利用されてきました。Open J9というプロジェクトもありアクティブですが、シェアはHotSpotが多いと思われます
![Page 18: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/18.jpg)
◯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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/19.jpg)
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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/20.jpg)
アジェンダ
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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/21.jpg)
・JavaもどきとかAndroid Javaとはなぜ言う人がいるか(またそれに対しての対応)
・違いを知る。実機では動かないけどIDEでは動く、なぜ?とか
・なぜHotSpotがあるのにAndroidはVMを独自に用意した?
2.Androidの人にとってのJVM
![Page 22: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/22.jpg)
・言葉が悪い
・JavaであってちょっとJavaでなくてちょっとJavaなのがAndroid・Android Javaぐらいが妥当な表現か
Javaもどき問題
![Page 23: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/23.jpg)
Javaもどき問題
・JLSは満たしているようだが、
JVMSは満たしていない
(歴史的経緯でTCKをパスしていない)・標準ライブラリが違う
例えばjava.beansパッケージに含まれているクラスが少ないなど
![Page 24: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/24.jpg)
アジェンダ
1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not Dalvik/ART)▷ 3.こんなに違う、マシン命令
4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ
![Page 25: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/25.jpg)
ちょっとその前に
![Page 26: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/26.jpg)
・HotSpotはスタックマシン
・Dalvik/ARTは(特殊な)レジスタマシン
スタックマシンは命令を積み上げ
レジスタマシンは命令をレジスタへの登録
Dalvik/ARTの場合はメモリ領域をレジスタと呼んでいる(特殊とはそのあたりのこと)
3.こんなに違う、マシン命令
![Page 27: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/27.jpg)
・HotSpotはスタックマシン
・Dalvik/ARTは(特殊な)レジスタマシン
スタックマシンは命令を積み上げ
レジスタマシンは命令をレジスタへの登録
Dalvik/ARTの場合はメモリ領域をレジスタと呼んでいる(特殊とはそのあたりのこと)
3.こんなに違う、マシン命令
そもそもマシンのモデルが違った
![Page 28: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/28.jpg)
簡略例:スタックマシン
3.こんなに違う、マシン命令
メモリ
スタック
![Page 29: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/29.jpg)
簡略例:スタックマシン
3.こんなに違う、マシン命令
メモリ
1スタック
1をPUSH
![Page 30: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/30.jpg)
簡略例:スタックマシン
3.こんなに違う、マシン命令
メモリ
2
1
スタック
2をPUSH
![Page 31: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/31.jpg)
簡略例:スタックマシン
3.こんなに違う、マシン命令
メモリ
1スタック
2をPOP
![Page 32: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/32.jpg)
簡略例:スタックマシン
3.こんなに違う、マシン命令
メモリ
スタック
1をPOP
![Page 33: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/33.jpg)
簡略例:スタックマシン
3.こんなに違う、マシン命令
メモリ
3スタック
POPした1 と 2を加算してPUSH
![Page 34: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/34.jpg)
簡略例:レジスタマシン
3.こんなに違う、マシン命令
メモリ
レジスタ
R0
R1
R2
R3
![Page 35: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/35.jpg)
簡略例:レジスタマシン
3.こんなに違う、マシン命令
メモリ
1レジスタ
R0
R1
R2
R3
R0に1を登録
![Page 36: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/36.jpg)
簡略例:レジスタマシン
3.こんなに違う、マシン命令
メモリ
1
2
レジスタ
R0
R1
R2
R3
R1に2を登録
![Page 37: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/37.jpg)
簡略例:レジスタマシン
3.こんなに違う、マシン命令
メモリ
1
2
3(R0 + R1)
レジスタ
R0
R1
R2
R3
R2にR0+R1を登録
![Page 38: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/38.jpg)
簡略例:Dalvik/ARTのレジスタマシン
3.こんなに違う、マシン命令
メモリ
メソッドB
メソッドB
メソッドA
メソッドA
レジスタ
R1
R0
R1
R0
![Page 39: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/39.jpg)
簡略例:Dalvik/ARTのレジスタマシン
3.こんなに違う、マシン命令
メモリ
メソッドB
メソッドB
メソッドA
メソッドA
レジスタ
R1
R0
R1
R0
メソッドごとにスタック。でもレジスタマシン。
![Page 40: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/40.jpg)
簡略例:Dalvik/ARTのレジスタマシン
3.こんなに違う、マシン命令
メモリ
メソッドB
メソッドB
メソッドA
メソッドA
レジスタ
R1
R0
R1
R0
レジスタと言いつつ演算用のメモリ領域に確保している
![Page 41: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/41.jpg)
簡略例:Dalvik/ARTのレジスタマシン
3.こんなに違う、マシン命令
メモリ
メソッドB
メソッドB
メソッドA
メソッドA
レジスタ
R1
R0
R1
R0
むずかしい!?
![Page 42: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/42.jpg)
このスライドが詳しいです。
Dalvik仮想マシンのアーキテクチャ 改訂版
https://www.slideshare.net/kmt-t/dalvik-10316622というかTakuya Matsunagaという方がすごい
3.こんなに違う、マシン命令
![Page 43: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/43.jpg)
なんで違う?
HotSpotはスタックマシン
・ハードウェアを問わず動かしやすいアーキテクチャ
・Run Anywhere的なところを優先した結果なのか・・・?
3.こんなに違う、マシン命令
![Page 44: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/44.jpg)
☆なんで違う?
Dalvik/ARTは(特殊な)レジスタマシン
・instruction dispatchを避けたかった
・不要なメモリアクセスを避けたかった
・命令処理の流れを素早くさばきたい
3.こんなに違う、マシン命令
![Page 45: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/45.jpg)
☆なんで違う?
Dalvik/ARTは(特殊な)レジスタマシン
・instruction dispatchを避けたかった
・不要なメモリアクセスを避けたかった
・命令処理の流れを素早くさばきたい
3.こんなに違う、マシン命令
・instruction dispatchとはメモリからの命令のフェッチや読み込み、ジャンプなどなど
![Page 46: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/46.jpg)
やっとマシン命令の話
![Page 47: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/47.jpg)
3.こんなに違う、マシン命令
・HotSpotマシン命令の一例
invokevirtual = インスタンスのメソッド呼び出しinvokeinterface = interfaceのメソッド呼び出しinvokestatic = staticメソッドの呼び出しinvokespecial = コンストラクタの呼び出し
よく見るやつですね
![Page 48: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/48.jpg)
・Dalvik/ARTマシン命令の一例
invoke-virtual = インスタンスのメソッド呼び出し
invoke-interface = interfaceのメソッド呼び出し
invoke-static = staticメソッドの呼び出し
new-instance = インスタンスの生成
3.こんなに違う、マシン命令
![Page 49: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/49.jpg)
大体一緒やん
![Page 50: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/50.jpg)
いえいえ、違うところも…
![Page 51: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/51.jpg)
3.こんなに違う、マシン命令
・HotSpotマシン命令の一例
invokevirtual = 0xb6invokeinterface = 0xb7invokestatic =0xb8invokespecial = 0xb9
![Page 52: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/52.jpg)
・Dalvik/ARTマシン命令の一例
invoke-virtual = 0x6einvoke-interface = 0x72invoke-static = 0x71new-instance = 0x22
3.こんなに違う、マシン命令
![Page 53: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/53.jpg)
・Dalvik/ARTマシン命令の一例
invoke-virtual = 0x6einvoke-interface = 0x72invoke-static = 0x71new-instance = 0x22オペコードの値は違う(そりゃそうか)
3.こんなに違う、マシン命令
![Page 54: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/54.jpg)
・Dalvik/ARTとHotSpotでどちらにもあるもの
return系命令
const系命令
if系命令
などなど。
3.こんなに違う、マシン命令
![Page 55: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/55.jpg)
・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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/56.jpg)
・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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/57.jpg)
・Dalvik/ARTとHotSpotでどちらにもあるもの
return系命令
const系命令
if系命令
などなど。
3.こんなに違う、マシン命令
などなど・・・。(気になる人は命令セットを比較してみて下さい)
![Page 58: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/58.jpg)
・Dalvik/ARTとHotSpotでどちらにもあるもの
return系命令
const系命令
if系命令
などなど。
3.こんなに違う、マシン命令
命令の名称やオペコードの値は色々違っているのだけど、大体やる処理としては同じ
![Page 59: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/59.jpg)
・Dalvik/ARTにしかなさそうなもの
move命令
->レジスタペアを別のレジスタに移動
invoke-polymophicとinvoke-custom->Androidの8.0から新しく使えるようになるオペコード。MethodHandleを呼び出すのだとか・・!
3.こんなに違う、マシン命令
![Page 60: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/60.jpg)
3.こんなに違う、マシン命令
・こんなに違う、は主にVMのマシンアーキテクチャだった
・それにともなって、マシン命令も違う(というより、オペコードの値は違う)
・実行バイナリが違うことも1つ大きな要因だと思います(この後に紹介します)
![Page 61: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/61.jpg)
アジェンダ
1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not dalvik/ART)3.こんなに違う、マシン命令
▷ 4.バイナリ(class、dex)5.ランタイムごとのAOT、JIT、GC6.まとめ
![Page 62: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/62.jpg)
4.バイナリ(class、dex)
・HotSpotはclassファイル
・Dalvik/ARTはdex(Dalvik Executable)ファイル
がそれぞれVMにロードされて
マシンコードになって実行される
![Page 63: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/63.jpg)
4.バイナリ(class、dex)ソースコード(javaファイル)
dexツール dexファイル
HotSpot VM Dalvik/ART VM
classファイル
![Page 64: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/64.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/65.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/66.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/67.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/68.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/69.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/70.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/71.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/72.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/73.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/74.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/75.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/76.jpg)
簡単ですね(?)
![Page 77: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/77.jpg)
☆classファイルフォーマット
・versioningされている
・情報ごとにカウントを持っている
・各情報の配列を持つ
・アクセシビリティの情報も持つ
・ただしバイナリを直接読むのは辛いし
javapで良い気がする
4.バイナリ(class、dex)
![Page 78: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/78.jpg)
続いてdex
![Page 79: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/79.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/80.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/81.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/82.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/83.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/84.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/85.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/86.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/87.jpg)
☆dexファイルフォーマット
8.call_site_ids 9.method_handles 10.data 11.link_data
4.バイナリ(class、dex)
![Page 88: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/88.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/89.jpg)
☆dexファイルフォーマット
8.call_site_ids 9.method_handles 10.data 11.link_data
4.バイナリ(class、dex)
ハンドリングするメソッドのリスト
![Page 90: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/90.jpg)
☆dexファイルフォーマット
8.call_site_ids 9.method_handles 10.data 11.link_data
4.バイナリ(class、dex)
全部のデータテーブルを持つ
![Page 91: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/91.jpg)
☆dexファイルフォーマット
8.call_site_ids 9.method_handles 10.data 11.link_data
4.バイナリ(class、dex)
静的リンクされた情報
![Page 92: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/92.jpg)
☆dexファイルフォーマット
・基本的に持っている情報は同じ
(身も蓋もない)・ただ並び順も持ち方も違う
・もちろんそれぞれのバイトコードは
それぞれのVMでしか動かない
4.バイナリ(class、dex)
![Page 93: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/93.jpg)
アジェンダ
1. Javaの人にとってのDalvik/ART2.Androidの人にとってのJVM(not dalvik/ART)3.こんなに違う、マシン命令
4.バイナリ(class、dex)▷ 5.ランタイムごとのAOT、JIT、GC6.まとめ
![Page 94: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/94.jpg)
・JIT(Just-In-Time Compiler)とは
実行時にネイティブコードにコンパイルする
・AOT(Ahead-Of-Time Compiler)とは
実行前にネイティブコードにコンパイルする
・GCとは
ガベージコレクション。JavaもAndroidも共通のメモリ管理の機構
5.ランタイムごとのAOT、JIT、GC
![Page 95: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/95.jpg)
・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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/96.jpg)
・HotSpotでJITが動いてるかどうか
->だいたい動いてる
・ホットなスポットだけJITする
・起動時にvm optionに -XX:+PrintCompilation って付けるとめっちゃJITされたログが出てくる
・-Djava.compiler=none を付け加えるとJITが無効になって何もログが出なくなる
5.ランタイムごとのAOT、JIT、GC
![Page 97: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/97.jpg)
☆JITの場合(HotSpot)ぼく「javac Hello.java」ぼく「java Hello」HotSpot「メソッド実行前にチェックします」
HotSpot「これはネイティブコードにしときますね〜」
5.ランタイムごとのAOT、JIT、GC
![Page 98: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/98.jpg)
☆JITの場合(Dalvik)ぼく「アプリインストールした。」
ぼく「起動してみよう」
Dalvik「メソッド実行前にチェックします」
Dalvik「これはネイティブコードにしときますね〜」
5.ランタイムごとのAOT、JIT、GC
![Page 99: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/99.jpg)
☆AOTの場合(ART)ぼく「アプリインストールしよっと」
ART「あ、これインストール中でもネイティブコードに出来ますわー」
ART「ネイティブコードにしときますね〜」
ぼく「よし、インストール出来た。使ってみよ」
5.ランタイムごとのAOT、JIT、GC
![Page 100: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/100.jpg)
☆AOTの場合(ART)ぼく「アプリインストールしよっと」
ART「あ、これインストール中でもネイティブコードに出来ますわー」
ART「ネイティブコードにしときますね〜」
ぼく「よし、インストール出来た。使ってみよ」
実行時のオーバーヘッドが少ない!!!
5.ランタイムごとのAOT、JIT、GC
![Page 101: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/101.jpg)
Google IO 2014 the ART Runtimeより
![Page 102: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/102.jpg)
ココ!!!
Google IO 2014 the ART Runtimeより
![Page 103: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/103.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/104.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/105.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/106.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/107.jpg)
どういうことか
![Page 108: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/108.jpg)
☆Android 5.0のARTぼく「アプリインストールしよっと」
ART「あ、これインストール中でもネイティブコードに出来ますわー」
ぼく「インストールめっちゃ長い。電池消費やばい。もうマヂムリ」
(ということもあったらしい)
5.ランタイムごとのAOT、JIT、GC
![Page 109: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/109.jpg)
Google IO 2016The Evolution of ARTより
![Page 110: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/110.jpg)
☆Android 7.0のAOT + JITぼく「アプリインストールしよっと」
ART「あ、これインストール中でもネイティブコードに出来ますわー。でも電池消費するからちょっとだけ。あとはJITさんに任せますわ」
ぼく「よしインストール出来たし、アプリ使ってみよっと」
5.ランタイムごとのAOT、JIT、GC
![Page 111: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/111.jpg)
☆Android 7.0のAOT + JITぼく「アプリインストールしよっと」
ART「あ、これインストール中でもネイティブコードに出来ますわー。でも電池消費するからちょっとだけ。あとはJITさんに任せますわ」
ぼく「よしインストール出来たし、アプリ使ってみよっと」->ユーザーのストレスが少ない形に
5.ランタイムごとのAOT、JIT、GC
![Page 112: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/112.jpg)
DalvikとARTの違いはこのあたり
・そもそもDalvikはシングルコア向けに作られていた
・Androidは8コアになった。だからART・スイープのpauseがARTの方が短くなったらしい
・dexファイルが動く、など基本的なところは同じ
・違いはAOTが入ったこと、GC改善、ロギング改善など
5.ランタイムごとのAOT、JIT、GC
![Page 113: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/113.jpg)
???「なるほど。AOTいいんじゃない?」
![Page 114: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/114.jpg)
???「HotSpotでやれば良いじゃないか」
![Page 115: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/115.jpg)
☆HotSpotのAOT
・・・・・・・・・・・・・。
5.ランタイムごとのAOT、JIT、GC
![Page 116: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/116.jpg)
☆HotSpotのAOT
あると思います!!!!
5.ランタイムごとのAOT、JIT、GC
![Page 117: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/117.jpg)
HotSpotのAOT
![Page 118: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/118.jpg)
HotSpotのAOT
![Page 119: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/119.jpg)
HotSpotのAOT
![Page 120: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/120.jpg)
☆JEP295
・Java 9では入らない
・javaコマンドオプションでAOTライブラリを指定
・It uses Graal as the code-generating backend.
5.ランタイムごとのAOT、JIT、GC
![Page 121: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/121.jpg)
☆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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/122.jpg)
99%Javaです!
5.ランタイムごとのAOT、JIT、GC
![Page 123: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/123.jpg)
つづいてGC!
![Page 124: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/124.jpg)
☆GCについて
HotSpotだと
・シリアル GC・パラレル GC・CMS GC(Java 9でdeprecated?)・G1GC(Java 9でデフォルト?)ココから選ぶことになる
5.ランタイムごとのAOT、JIT、GC
![Page 125: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/125.jpg)
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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/126.jpg)
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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/127.jpg)
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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/128.jpg)
5.ランタイムごとのAOT、JIT、GCDalvik
Google IO 2014 the ART Runtimeより
![Page 129: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/129.jpg)
5.ランタイムごとのAOT、JIT、GCART
Google IO 2014 the ART Runtimeより
![Page 130: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/130.jpg)
アジェンダ
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](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/131.jpg)
なんのためのDalvik、ARTか・Androidに最適化されている
・ARTは最近?のAndroid端末に合わせての更なる最適化・当たり前だがプラットフォームが違えば要求される実行環境(VM)も違う
・プラットフォームを優先した結果独自VMとして別々の道を歩むことになった
6.まとめ
![Page 132: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/132.jpg)
・プラットフォームに合わせるために犠牲はつきもの?
->Android SDKに無くて、JDKにあるものはあるが、バランスを考えてそうなっている
・どちらも頑張った結果
->HotSpotはPCマシン(あるいはサーバー)前提で最適化を頑張った結果、Dalvik/ARTはAndroidプラットフォーム前提で頑張った結果
6.まとめ
![Page 133: VMの歩む道。 Dalvik、ART、そしてJava VM](https://reader034.fdocument.pub/reader034/viewer/2022050613/5a6478967f8b9a46568b45c5/html5/thumbnails/133.jpg)
・VMをブラックボックスとして扱う技術者にならないように(自戒を込めて)・どう動いているのか意識して、その上でIDEに任せて楽をしたい
・何が起こってるか理解できないと問題を解決できない
6.まとめ