SlideShare a Scribd company logo
1 of 20
Download to read offline
Froyo の DalvikVM の JIT
 Google I/O のセッションの解説



    Tetsuyuki Kobayashi
Who am I?

   20+ years involved in embedded systems
       10 years in real time OS, such as iTRON
       10 years in embedded Java Virtual Machine
       Now Gcc, Linux, QEMU, Android, …
   Blogs
       http://d.hatena.ne.jp/embedded/ (Personal)
       http://blog.kmckk.com/ (Corporate)
   Twitter
       @tetsu_koba
                                                     2
Today's topic

   
       Google I/O での DalvikVM の JIT のセッション
       を読み解こう
      ”A JIT Compiler for Android's Dalvik VM”
   
       Ben Cheng, Bill Buzbee
      このセッション資料をわかるところだけ訳出し
       てみました。
http://code.google.com/intl/ja/events/io/2010/sessions/jit-compiler-androids-dalvik-vm.html




                                                                                         3
Dalvik インタプリタ

   普通は 1/3 の時間しかインタプリタで消費されてい
    ない。
   OS や性能に効くところはネイティブコードで書かれ
    ているから。
   通常のアプリケーションには充分。
   それでも CPU 喰いのアプリには
     NDK でネイティブ化


     JIT コンパイラ




                             4
どんな JIT?


    いつコンパイルするか
     インストール時、起動時、メソッド呼び出し時、命

      令フェッチ時
   何をコンパイルするか
     プログラム全体、共有ライブラリ、ページ、メソッ

      ド、トレース、命令




                                5
どんな JIT?

   それぞれの組み合わせに利点と欠点がある
   Android で重視する点
      最小限の追加メモリ


      DalvikVM のコンテナベースのセキュリティモデ

       ル
      起動してすぐに加速する


      インタプリタとコンパイル済みコードの間のス

       ムーズな遷移


                                    6
メソッド単位の JIT

   ほとんどのサーバ用 Java の JIT はこのタイプ
   ホットなメソッドをみつけてメソッド単位でコンパイル
    とオプティマイズを行う
   利点
       より大きな最適化のウィンドウ
    
        メソッド呼び出しのところで仮想マシンの状態を同期
   欠点
    
        ホットメソッドの中のコールドコードもコンパイルされる
    
        コンパイル中にずっと大きなメモリが必要
       メソッドがホットになってからコンパイルして実行される
        までのディレイが大きい                  7
トレース単位の JIT
   ホットな実行経路をさがしながらインタープリタが実
    行される。
   コンパイルしたコードの断片はトランスレーション
    キャッシュの中につながれる
   利点
       ホットコードしかコンパイルされないのでメモリ消費が最
        小限。
       ホットなコードのコンパイル、実行までが素早い。
   欠点
       最適化の範囲が狭いので、ピーク性能が制限される。
       インタープリタとの状態の同期の回数がずっと多い。
    
        プロセスをまたがってトランスレーションキャッシュを共   8

        有することが難しい。
9
決断:トレース JIT から始めることにした
   使用メモリを最小限にすることがモバイルデバイス
    では最重要。
   素早く性能向上があることが重要。
       JIT のために長時間かかるとその間にユーザはあきら
        めてしまうかも。
   メソッド単位の JIT と補完する可能性を残す
       両者は共存可能。
       モバイルデバイスも電源につながっている時はサーバ
        のように見える。
       いいとこ取り
               バッテリ駆動時はトレース JIT
               充電中はバックグランドでメソッド JIT   10
Dalvik Trace JIT Flow




                        11
Dalvik JIT v1.0 Overview
   インタプリタとの密接な統合
    
        JIT をインタプリタの拡張と考えると便利
   インタプリタはプロファイルを行ってホットなコードを
    みつけたらモードを切り替える
   トレース要求はインタープリット中に処理される
       実際の実行中の値にアクセスできる
       トレースには少なくとも一回以上は実行できたところだ
        けが含まれることが保証されている。 ( ある種の最適化
        で便利)
   トレース要求はコンパイラスレッドに渡され、そこで
    ネイティブコードにコンパイルされる。

    コンパイルしたコードはトランスレーションキャッ 12
    シュにつながれる。
Dalvik JIT v1.0 Features
   プロセスごとのトランスレーションキャッシュ。(セ
    キュリティサンドボックスの中でのみ共有。)
   シンプルなトレース。一般的にひとつかふたつの
    ベーシックブロックの分だけ。
   Local optimizations
    
        Register promotion
    
        Load/store elimination
    
        Redundant null-check elimination
    
        Heuristic scheduling
   Loop optimizations
    
        Simple loop detection
    
        Invariant code motion              13

    
        Induction variable optimization
ベンチマーク結果




           14
次の方向性

   メソッドのインライン化
   Trace extension
   Persistent profile information
   Off-line trace coalescing

    Off-line method translation
   チューニング、チューニング、もっとチューニング!



                                 15
ケーススタディ

   Robo Defence というアクション系のゲーム
       75% の時間は skia 描画ライブラリ
       DalvikVM ではわずか 4%
       JIT で向上する部分は DalvikVM での部分だけなの
        で、このゲームでは JIT の効果はわずか
   Checker というパズルゲーム
       大半の時間を DalvikVM の実行が占める。
       このケースは JIT の効果が高い。 5.4 倍の向上。
       これに JIT を適用した結果 94% の時間は JIT の
        コードキャッシュの中。                      16
Code Cache の中を覗いてみると

   起動から 20 分間で  9898 回コンパイル 合
    計 796264 バイト (1 回あたり 80 バイト)
   生成したネイティブコードサイズは元の Dex
    コードの約 7.7 倍。

    コンパイルの合計時間は 6 秒 (1 回の平均は
    0.6msec)



                               17
まとめ

    リソースを喰わない Dalvik JIT compiler
    
      追加のメモリ要求量はわずか 100KB

    バイトコード実行速度で 2 ~ 5 倍の向上

    さらなるチューニングの予定




                                    18
感想

    普通の JIT の弱点
       コンパイルによるもたつき、起動時間増加
    
        メモリ消費増大 → GC 頻発 → もたつき
   Dalvik の JIT はこれらの弱点を上手におさえこんで
    いるところが素晴らしい!



   ソースが公開が楽しみ

    何かわかったらまたどこかで話します。

                                 19
Thank you



Thank you for listening!



Special thanks to @yoshi_rr and @kojira,
who USTREAMed this session to us.


                                           20

More Related Content

What's hot

パケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapパケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapfurandon_pig
 
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとはコンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとはksk_ha
 
あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。Masahito Zembutsu
 
とある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱとある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理ⅡMasami Ichikawa
 
15分で分か(った気になれ)るDocker
15分で分か(った気になれ)るDocker15分で分か(った気になれ)るDocker
15分で分か(った気になれ)るDockerMasahiro NAKAYAMA
 
ラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSnpsg
 
Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎Hiroaki_UKAJI
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presenKouhei Maeda
 
Ylug 110th kpatch code reading
Ylug 110th kpatch code readingYlug 110th kpatch code reading
Ylug 110th kpatch code readingMasami Hiramatsu
 
DockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかDockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかEmma Haruka Iwao
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪Kunihiro TANAKA
 
[Container Runtime Meetup] runc & User Namespaces
[Container Runtime Meetup] runc & User Namespaces[Container Runtime Meetup] runc & User Namespaces
[Container Runtime Meetup] runc & User NamespacesAkihiro Suda
 
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINARVirtualTech Japan Inc.
 
Dive into dockerネットワーク
Dive into dockerネットワークDive into dockerネットワーク
Dive into dockerネットワークKazuyuki Mori
 
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオンJAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオンRyo Nakamaru
 

What's hot (20)

パケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapパケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmap
 
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとはコンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
 
Docker入門
Docker入門Docker入門
Docker入門
 
あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。
 
Lagopus 0.2
Lagopus 0.2Lagopus 0.2
Lagopus 0.2
 
とある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱとある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱ
 
15分で分か(った気になれ)るDocker
15分で分か(った気になれ)るDocker15分で分か(った気になれ)るDocker
15分で分か(った気になれ)るDocker
 
ラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaS
 
Mincs 日本語版
Mincs 日本語版Mincs 日本語版
Mincs 日本語版
 
Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
Ylug 110th kpatch code reading
Ylug 110th kpatch code readingYlug 110th kpatch code reading
Ylug 110th kpatch code reading
 
DockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかDockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのか
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
 
[Container Runtime Meetup] runc & User Namespaces
[Container Runtime Meetup] runc & User Namespaces[Container Runtime Meetup] runc & User Namespaces
[Container Runtime Meetup] runc & User Namespaces
 
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
 
Dive into dockerネットワーク
Dive into dockerネットワークDive into dockerネットワーク
Dive into dockerネットワーク
 
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオンJAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
Lagopus 0.2.2
Lagopus 0.2.2Lagopus 0.2.2
Lagopus 0.2.2
 

Viewers also liked

Reusing your existing software on Android
Reusing your existing software on AndroidReusing your existing software on Android
Reusing your existing software on AndroidTetsuyuki Kobayashi
 
Firefox OS 日本語 IME 開発状況
Firefox OS 日本語 IME 開発状況Firefox OS 日本語 IME 開発状況
Firefox OS 日本語 IME 開発状況Honma Masashi
 
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだったバッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだったMasami Yabushita
 
Using QEMU for cross development
Using QEMU for cross developmentUsing QEMU for cross development
Using QEMU for cross developmentTetsuyuki Kobayashi
 

Viewers also liked (9)

Reusing your existing software on Android
Reusing your existing software on AndroidReusing your existing software on Android
Reusing your existing software on Android
 
Firefox OS 日本語 IME 開発状況
Firefox OS 日本語 IME 開発状況Firefox OS 日本語 IME 開発状況
Firefox OS 日本語 IME 開発状況
 
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだったバッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
 
QEMU in Cross building
QEMU in Cross buildingQEMU in Cross building
QEMU in Cross building
 
Android On Ubuntu for developer
Android On Ubuntu for developerAndroid On Ubuntu for developer
Android On Ubuntu for developer
 
Logging system of Android
Logging system of AndroidLogging system of Android
Logging system of Android
 
Using QEMU for cross development
Using QEMU for cross developmentUsing QEMU for cross development
Using QEMU for cross development
 
Android ipm 20110409
Android ipm 20110409Android ipm 20110409
Android ipm 20110409
 
Logging system of Android
Logging system of AndroidLogging system of Android
Logging system of Android
 

Similar to Froyo DalvikVM JIT

Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)NTT DATA Technology & Innovation
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)NTT DATA Technology & Innovation
 
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)NTT DATA Technology & Innovation
 
20190219 hyperledger tokyo_meetup_min_bft
20190219 hyperledger tokyo_meetup_min_bft20190219 hyperledger tokyo_meetup_min_bft
20190219 hyperledger tokyo_meetup_min_bftHyperleger Tokyo Meetup
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングYosuke Mizutani
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker雄哉 吉田
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)NTT DATA Technology & Innovation
 
エンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learned
エンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learnedエンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learned
エンプラに Kubernetes を 導入してみて分かった 4つの Lessons LearnedDaiki Kawanuma
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Takako Miyagawa
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)NTT DATA Technology & Innovation
 
今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみたKohei Tokunaga
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMFAtomu Hidaka
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例UnityTechnologiesJapan002
 
OpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugOpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugYuji Kubota
 
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]David Buck
 
AnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a CodeAnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a CodeSatoru Yoshida
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMFAtomu Hidaka
 

Similar to Froyo DalvikVM JIT (20)

Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
Let's play with Goldfish
Let's play with GoldfishLet's play with Goldfish
Let's play with Goldfish
 
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
 
20190219 hyperledger tokyo_meetup_min_bft
20190219 hyperledger tokyo_meetup_min_bft20190219 hyperledger tokyo_meetup_min_bft
20190219 hyperledger tokyo_meetup_min_bft
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
 
エンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learned
エンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learnedエンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learned
エンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learned
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
 
ZendStudioのご紹介
ZendStudioのご紹介ZendStudioのご紹介
ZendStudioのご紹介
 
ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
 
今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
 
OpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugOpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjug
 
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
 
AnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a CodeAnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a Code
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF
 

More from Tetsuyuki Kobayashi

Try new transport protocol SRT (ver. 2)
Try new transport protocol SRT  (ver. 2)Try new transport protocol SRT  (ver. 2)
Try new transport protocol SRT (ver. 2)Tetsuyuki Kobayashi
 
Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機
Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機
Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機Tetsuyuki Kobayashi
 
WebOS Open Source Edition を試してみた
WebOS Open Source Edition を試してみたWebOS Open Source Edition を試してみた
WebOS Open Source Edition を試してみたTetsuyuki Kobayashi
 
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くLinuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くTetsuyuki Kobayashi
 
組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)Tetsuyuki Kobayashi
 
組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメTetsuyuki Kobayashi
 
Simple and efficient way to get the last log using MMAP
Simple and efficient way to get the last log using MMAPSimple and efficient way to get the last log using MMAP
Simple and efficient way to get the last log using MMAPTetsuyuki Kobayashi
 
Basic of virtual memory of Linux
Basic of virtual memory of LinuxBasic of virtual memory of Linux
Basic of virtual memory of LinuxTetsuyuki Kobayashi
 
ADB(Android Debug Bridge): How it works?
ADB(Android Debug Bridge): How it works?ADB(Android Debug Bridge): How it works?
ADB(Android Debug Bridge): How it works?Tetsuyuki Kobayashi
 
Inter-process communication of Android
Inter-process communication of AndroidInter-process communication of Android
Inter-process communication of AndroidTetsuyuki Kobayashi
 
Android is NOT just 'Java on Linux'
Android is NOT just 'Java on Linux'Android is NOT just 'Java on Linux'
Android is NOT just 'Java on Linux'Tetsuyuki Kobayashi
 

More from Tetsuyuki Kobayashi (20)

some topic of ffmpeg
some topic of ffmpeg some topic of ffmpeg
some topic of ffmpeg
 
New VIdeo CODEC AV1
New VIdeo CODEC AV1 New VIdeo CODEC AV1
New VIdeo CODEC AV1
 
Try new transport protocol SRT (ver. 2)
Try new transport protocol SRT  (ver. 2)Try new transport protocol SRT  (ver. 2)
Try new transport protocol SRT (ver. 2)
 
Try new transport protocol SRT
Try new transport protocol SRTTry new transport protocol SRT
Try new transport protocol SRT
 
Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機
Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機
Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機
 
WebOS Open Source Edition を試してみた
WebOS Open Source Edition を試してみたWebOS Open Source Edition を試してみた
WebOS Open Source Edition を試してみた
 
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くLinuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書く
 
組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)
 
組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ
 
ARM 64bit has come!
ARM 64bit has come!ARM 64bit has come!
ARM 64bit has come!
 
Virtual memory 20070222-en
Virtual memory 20070222-enVirtual memory 20070222-en
Virtual memory 20070222-en
 
Simple and efficient way to get the last log using MMAP
Simple and efficient way to get the last log using MMAPSimple and efficient way to get the last log using MMAP
Simple and efficient way to get the last log using MMAP
 
Tips of Malloc & Free
Tips of Malloc & FreeTips of Malloc & Free
Tips of Malloc & Free
 
Basic of virtual memory of Linux
Basic of virtual memory of LinuxBasic of virtual memory of Linux
Basic of virtual memory of Linux
 
ADB(Android Debug Bridge): How it works?
ADB(Android Debug Bridge): How it works?ADB(Android Debug Bridge): How it works?
ADB(Android Debug Bridge): How it works?
 
Tweaking Google TV emulator
Tweaking Google TV emulatorTweaking Google TV emulator
Tweaking Google TV emulator
 
Inter-process communication of Android
Inter-process communication of AndroidInter-process communication of Android
Inter-process communication of Android
 
Android is NOT just 'Java on Linux'
Android is NOT just 'Java on Linux'Android is NOT just 'Java on Linux'
Android is NOT just 'Java on Linux'
 
Init of Android
Init of AndroidInit of Android
Init of Android
 
Opensource Android
Opensource AndroidOpensource Android
Opensource Android
 

Froyo DalvikVM JIT

  • 1. Froyo の DalvikVM の JIT Google I/O のセッションの解説 Tetsuyuki Kobayashi
  • 2. Who am I?  20+ years involved in embedded systems  10 years in real time OS, such as iTRON  10 years in embedded Java Virtual Machine  Now Gcc, Linux, QEMU, Android, …  Blogs  http://d.hatena.ne.jp/embedded/ (Personal)  http://blog.kmckk.com/ (Corporate)  Twitter  @tetsu_koba 2
  • 3. Today's topic  Google I/O での DalvikVM の JIT のセッション を読み解こう  ”A JIT Compiler for Android's Dalvik VM”  Ben Cheng, Bill Buzbee  このセッション資料をわかるところだけ訳出し てみました。 http://code.google.com/intl/ja/events/io/2010/sessions/jit-compiler-androids-dalvik-vm.html 3
  • 4. Dalvik インタプリタ  普通は 1/3 の時間しかインタプリタで消費されてい ない。  OS や性能に効くところはネイティブコードで書かれ ているから。  通常のアプリケーションには充分。  それでも CPU 喰いのアプリには  NDK でネイティブ化  JIT コンパイラ 4
  • 5. どんな JIT?  いつコンパイルするか  インストール時、起動時、メソッド呼び出し時、命 令フェッチ時  何をコンパイルするか  プログラム全体、共有ライブラリ、ページ、メソッ ド、トレース、命令 5
  • 6. どんな JIT?  それぞれの組み合わせに利点と欠点がある  Android で重視する点  最小限の追加メモリ  DalvikVM のコンテナベースのセキュリティモデ ル  起動してすぐに加速する  インタプリタとコンパイル済みコードの間のス ムーズな遷移 6
  • 7. メソッド単位の JIT  ほとんどのサーバ用 Java の JIT はこのタイプ  ホットなメソッドをみつけてメソッド単位でコンパイル とオプティマイズを行う  利点  より大きな最適化のウィンドウ  メソッド呼び出しのところで仮想マシンの状態を同期  欠点  ホットメソッドの中のコールドコードもコンパイルされる  コンパイル中にずっと大きなメモリが必要  メソッドがホットになってからコンパイルして実行される までのディレイが大きい 7
  • 8. トレース単位の JIT  ホットな実行経路をさがしながらインタープリタが実 行される。  コンパイルしたコードの断片はトランスレーション キャッシュの中につながれる  利点  ホットコードしかコンパイルされないのでメモリ消費が最 小限。  ホットなコードのコンパイル、実行までが素早い。  欠点  最適化の範囲が狭いので、ピーク性能が制限される。  インタープリタとの状態の同期の回数がずっと多い。  プロセスをまたがってトランスレーションキャッシュを共 8 有することが難しい。
  • 9. 9
  • 10. 決断:トレース JIT から始めることにした  使用メモリを最小限にすることがモバイルデバイス では最重要。  素早く性能向上があることが重要。  JIT のために長時間かかるとその間にユーザはあきら めてしまうかも。  メソッド単位の JIT と補完する可能性を残す  両者は共存可能。  モバイルデバイスも電源につながっている時はサーバ のように見える。  いいとこ取り  バッテリ駆動時はトレース JIT  充電中はバックグランドでメソッド JIT 10
  • 11. Dalvik Trace JIT Flow 11
  • 12. Dalvik JIT v1.0 Overview  インタプリタとの密接な統合  JIT をインタプリタの拡張と考えると便利  インタプリタはプロファイルを行ってホットなコードを みつけたらモードを切り替える  トレース要求はインタープリット中に処理される  実際の実行中の値にアクセスできる  トレースには少なくとも一回以上は実行できたところだ けが含まれることが保証されている。 ( ある種の最適化 で便利)  トレース要求はコンパイラスレッドに渡され、そこで ネイティブコードにコンパイルされる。  コンパイルしたコードはトランスレーションキャッ 12 シュにつながれる。
  • 13. Dalvik JIT v1.0 Features  プロセスごとのトランスレーションキャッシュ。(セ キュリティサンドボックスの中でのみ共有。)  シンプルなトレース。一般的にひとつかふたつの ベーシックブロックの分だけ。  Local optimizations  Register promotion  Load/store elimination  Redundant null-check elimination  Heuristic scheduling  Loop optimizations  Simple loop detection  Invariant code motion 13  Induction variable optimization
  • 15. 次の方向性  メソッドのインライン化  Trace extension  Persistent profile information  Off-line trace coalescing  Off-line method translation  チューニング、チューニング、もっとチューニング! 15
  • 16. ケーススタディ  Robo Defence というアクション系のゲーム  75% の時間は skia 描画ライブラリ  DalvikVM ではわずか 4%  JIT で向上する部分は DalvikVM での部分だけなの で、このゲームでは JIT の効果はわずか  Checker というパズルゲーム  大半の時間を DalvikVM の実行が占める。  このケースは JIT の効果が高い。 5.4 倍の向上。  これに JIT を適用した結果 94% の時間は JIT の コードキャッシュの中。 16
  • 17. Code Cache の中を覗いてみると  起動から 20 分間で  9898 回コンパイル 合 計 796264 バイト (1 回あたり 80 バイト)  生成したネイティブコードサイズは元の Dex コードの約 7.7 倍。  コンパイルの合計時間は 6 秒 (1 回の平均は 0.6msec) 17
  • 18. まとめ  リソースを喰わない Dalvik JIT compiler  追加のメモリ要求量はわずか 100KB  バイトコード実行速度で 2 ~ 5 倍の向上  さらなるチューニングの予定 18
  • 19. 感想  普通の JIT の弱点  コンパイルによるもたつき、起動時間増加  メモリ消費増大 → GC 頻発 → もたつき  Dalvik の JIT はこれらの弱点を上手におさえこんで いるところが素晴らしい!   ソースが公開が楽しみ  何かわかったらまたどこかで話します。 19
  • 20. Thank you Thank you for listening! Special thanks to @yoshi_rr and @kojira, who USTREAMed this session to us. 20