Movatterモバイル変換


[0]ホーム

URL:


Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)

Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(2020年11⽉7⽇ JJUG CCC 2020 Fall 講演資料)NTTデータ 技術開発本部先進コンピューティング技術センタ阪⽥ 浩⼀

Embed presentation

© 2020 NTT DATA CorporationJavaコードが速く実⾏される秘密- JITコンパイラ⼊⾨2020年11⽉7⽇ JJUG CCC 2020 Fall株式会社NTTデータ 技術開発本部阪⽥ 浩⼀
© 2020 NTT DATA Corporation 2⾃⼰紹介• 阪⽥ 浩⼀(さかた -)• 通称 じゅくちょー• JVMになりたい⼈• NTTデータでJava/OpenJDK + GraalVMの研究開発とそのサポート業に従事しています• Javaチャンピオン• OpenJDK Authorjyukutyo
© 2020 NTT DATA Corporation 3このセッションの役割JVMの現在の実⾏速度を実現したJITコンパイラの仕組みを(概観として)伝える
© 2020 NTT DATA Corporation 4Javaアプリケーションの実⾏までの流れをおさらいしましょう
© 2020 NTT DATA Corporation 5javacでのコンパイルJavaコードコンパイル(javac)クラスファイル
© 2020 NTT DATA Corporation 6cafe babe 0000 0034 001d 0a00 0600 0f09 .......4........0010 0011 0800 120a 0013 0014 0700 1507 ................0016 0100 063c 696e 6974 3e01 0003 2829 .....<init>...()5601 0004 436f 6465 0100 0f4c 696e 654e V...Code...LineN756d 6265 7254 6162 6c65 0100 046d 6169 umberTable...mai6e01 0016 285b 4c6a 6176 612f 6c61 6e67 n...([Ljava/lang2f53 7472 696e 673b 2956 0100 0a53 6f75 /String;)V...Sou7263 6546 696c 6501 000f 4865 6c6c 6f57 rceFile...HelloW6f72 6c64 2e6a 6176 610c 0007 0008 0700 orld.java.......クラスファイル
© 2020 NTT DATA Corporation 7メソッドの処理をJavaバイトコードで記述する
© 2020 NTT DATA Corporation 8https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-7.html
© 2020 NTT DATA Corporation 9Javaでのコンパイル(javac)実施タイミング アプリケーション実⾏前⼊⼒ Javaコード出⼒ Javaバイトコード
© 2020 NTT DATA Corporation 10$ javap -c HelloWorldclass HelloWorld {...public static void main(java.lang.String...);Code:0: getstatic #23: ldc #35: invokevirtual #48: return}javap
© 2020 NTT DATA Corporation 11JVMはクラスファイルを読み込み、アプリケーションを実⾏する
© 2020 NTT DATA Corporation 12JVMは処理をどのように実⾏する︖
© 2020 NTT DATA Corporation 13バイトコードをインタプリト、つまり逐次処理する
© 2020 NTT DATA Corporation 14今から25年前…Javaの実⾏は遅かった
© 2020 NTT DATA Corporation 15理由の1つは、すべての処理がインタプリタ実⾏だったこと
© 2020 NTT DATA Corporation 16Java (J2SE) 1.3でJITコンパイルを標準で使うように
© 2020 NTT DATA Corporation 17このJITコンパイルが今でもJavaの速さの主な要因
© 2020 NTT DATA Corporation 18JITコンパイルの仕組みJavaバイトコードJITコンパイル機械語プロファイル情報
© 2020 NTT DATA Corporation 19JITコンパイル「実⾏中」に機械語へコンパイル︕JVM
© 2020 NTT DATA Corporation 20各プラットフォーム(主にCPU)の機械語を⽣成、キャッシュして実⾏する
© 2020 NTT DATA Corporation 21さらに、実⾏時の情報をプロファイリングし、それを機械語⽣成に活⽤する
© 2020 NTT DATA Corporation 22その結果、実⾏パフォーマンスが向上する
© 2020 NTT DATA Corporation 23コードをすべてJITコンパイルしているのか︖
© 2020 NTT DATA Corporation 24前提JITコンパイルはアプリケーションの実⾏中に動作するものである
© 2020 NTT DATA Corporation 25トレードオフJITコンパイル処理⾃体がリソースを消費する
© 2020 NTT DATA Corporation 26トレードオフのバランスを取るプロファイル情報からよく実⾏する処理(頻繁に呼ばれるメソッドなど)をコンパイル対象にする
© 2020 NTT DATA Corporation 27よく実⾏する処理=ホットスポット
© 2020 NTT DATA Corporation 28(おそらく今使っている) JVMHotSpot VM(OpenJDK / Oracle JDK)
© 2020 NTT DATA Corporation 29さらなるトレードオフよりよい機械語を⽣成するには、より⻑いコンパイル時間が必要となる
© 2020 NTT DATA Corporation 30さらなるトレードオフコンパイル時間短縮or速いコードの⽣成
© 2020 NTT DATA Corporation 31HotSpot VMでは2つのJITコンパイラを使う
© 2020 NTT DATA Corporation 32HotSpot VMでの2つのJITコンパイラ• C1コンパイラ• コンパイル時間が短い• それほど速くない機械語する• C2コンパイラ• 速いコードを⽣成する• コンパイル時間が⻑くなる
© 2020 NTT DATA Corporation 33メソッドに対するコンパイルと呼び出し時間のイメージC2C1コンパイル時間が⻑くても、その後の処理実⾏が⾼速になり、「元が取れる」
© 2020 NTT DATA Corporation 34Java歴が⻑い⼈向け昔、実⾏オプションで-server ってつけてましたよね︖
© 2020 NTT DATA Corporation 35HotSpot VMでの2つのJITコンパイラ• C1コンパイラ(clientコンパイラ)• コンパイル時間が短い• それほど速くない機械語する• C2コンパイラ(serverコンパイラ)• 速いコードを⽣成する• コンパイル時間が⻑くなる
© 2020 NTT DATA Corporation 36-server とは、C2コンパイラを使⽤する、という意味です
© 2020 NTT DATA Corporation 37Java 8からは-server不要Tiered Compilation(階層型コンパイル)がデフォルトになったため
© 2020 NTT DATA Corporation 38バイトコード C1⽣成機械語 C2⽣成機械語Tiered Compilation概要• C1とC2の両⽅を使う
© 2020 NTT DATA Corporation 39JITコンパイルのログを出⼒してみよう︕
© 2020 NTT DATA Corporation 40JITコンパイルのログ設定• 以下のオプションを付ける• -XX:+PrintCompilation• コンソールにコンパイルログを出⼒する
© 2020 NTT DATA Corporation 41PrintCompilationの出⼒181 416 4 java.lang.AbstractStringBuilder::append (45 bytes)182 417 ! 3 java.util.zip.InflaterInputStream::read (138 bytes)182 420 n 0 java.util.zip.Inflater::inflateBytesBytes (native)182 418 3 java.util.zip.InflaterInputStream::ensureOpen (18 bytes)182 419 3 java.io.RandomAccessFile::seek (22 bytes)183 421 3 java.util.WeakHashMap::getTable (9 bytes)183 422 ! 3 java.util.WeakHashMap::expungeStaleEntries (139 bytes)184 423 3 java.util.WeakHashMap::indexFor (6 bytes)184 424 3 java.io.File::isInvalid (48 bytes)184 427 3 java.util.zip.ZipUtils::CENSIZ (9 bytes)184 428 3 java.io.UnixFileSystem::normalize (41 bytes)185 429 3 java.util.zip.ZipFile::ensureOpen (40 bytes)185 425 1 java.nio.HeapByteBuffer::isDirect (2 bytes)185 431 s 3 jdk.internal.loader.Resource::cachedInputStream (20 bytes)
© 2020 NTT DATA Corporation 42デモSpringBoot起動でのJITコンパイルログ出⼒
© 2020 NTT DATA Corporation 43実際のJITコンパイルログ32 5 3 java.lang.String::coder (15 bytes)...150 235 4 java.lang.String::coder (15 bytes)151 5 3 java.lang.String::coder (15 bytes) made not entrant経過時間コンパイルID最適化レベル 破棄したコンパイルしたメソッドのバイト数
© 2020 NTT DATA Corporation 44JITコンパイルの最適化レベル最適化レベル: 0インタプリタ⼀般的ケースプロファイリングなしベーシックカウンタのみ詳細3 4C2が詰まっているケース 0 2 43効果が薄いメソッドのケース0 1 3C1コンパイラ C2
© 2020 NTT DATA Corporation 45JITコンパイラの最適化レベル0 インタプリタ実⾏1 C1 (プロファイリングなし)2C1 (ベーシックカウンタのみプロファイリング)3 C1 (完全なプロファイリング)4 C2
© 2020 NTT DATA Corporation 46$ javap -c --module java.base java.lang.String...byte coder();Code:0: getstatic3: ifeq6: aload_07: getfield10: goto13: iconst_114: ireturnメソッドのバイト数String#coder()は15バイトのメソッド︕
© 2020 NTT DATA Corporation 47再掲︓実際のJITコンパイルログ32 5 3 java.lang.String::coder (15 bytes)...150 235 4 java.lang.String::coder (15 bytes)151 5 3 java.lang.String::coder (15 bytes) made not entrant経過時間コンパイルID最適化レベル 破棄したコンパイルしたメソッドのバイト数
© 2020 NTT DATA Corporation 48JITコンパイルのログ設定• 以下のオプションを付ける• -XX:+PrintCompilation• コンソールにコンパイルログを出⼒する• Unified JVM Loggingでも出⼒できます• -Xlog:jit+compilation=debug
© 2020 NTT DATA Corporation 49JITコンパイラがコンパイルしたメソッドはわかったけど⽣成した機械語も⾒たい︕
© 2020 NTT DATA Corporation 50たとえばこういったケース• あるメソッドがJITコンパイルされているか確認したい• パフォーマンスに⼤きく影響するメソッドである場合• 実⾏中のどの時点でJITコンパイルされたかが重要な場合• オプションの変更による影響を確認する場合
© 2020 NTT DATA Corporation 51HSDIS(HotSpot Disassembler)• JIT⽣成の機械語をアセンブリに変換して出⼒するライブラリ• HotSpot VM⽤(通常のOpenJDKとOracle JDK)• OpenJDKに含まれている• src/utils/hsdis ディレクトリで⾃分でビルドする• ビルド⼿順参考︓https://www.slideshare.net/nttdata-tech/java-maximize-cpu-2019-nttdata-suenaga• HSDISをビルドし、JDKに配置する• [JAVA_HOME]/lib ディレクトリ• 以下のオプションを付けて起動する• -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
© 2020 NTT DATA Corporation 52HSDISの出⼒Demo2.workload(I)I (Demo2.workload(int)) [0x000000010b997b20, 0x000000010b997b60] 64 bytes[Entry Point][Constants]# {method} {0x000000012709faf8} 'workload' '(I)I' in 'Demo2'# this: rsi:rsi = 'Demo2'# parm0: rdx = int# [sp+0x10] (sp of caller)0x000000010b997b20: mov 0x8(%rsi),%r10d0x000000010b997b24: shl $0x3,%r100x000000010b997b28: cmp %r10,%rax0x000000010b997b2b: jne 0x000000010b92f000 ; {runtime_call ic_miss_stub}0x000000010b997b31: nop0x000000010b997b32: nopl 0x0(%rax)0x000000010b997b39: nopl 0x0(%rax)[Verified Entry Point]0x000000010b997b40: nopl 0x0(%rax,%rax,1)0x000000010b997b45: inc %edx ;*iadd {reexecute=0 rethrow=0 return_oop=0}; - Demo2::workload@2 (line 9)0x000000010b997b47: mov %edx,%eax ;*ireturn {reexecute=0 rethrow=0 return_oop=0}
© 2020 NTT DATA Corporation 53デモSpringBoot起動時のアセンブリ表⽰
© 2020 NTT DATA Corporation 54読みやすいとは⾔えません
© 2020 NTT DATA Corporation 55出⼒するメソッドを指定できる• CompileOnlyオプションを付与する• -XX:CompileOnly=String::startsWith -XX:CompileCommand=quiet• コンパイラディレクティブを使う1. JSONファイルで対象を指定する2. -XX:+UnlockDiagnosticVMOptions -XX:CompilerDirectivesFile=directive.json[{match: "java/lang/String.*",PrintAssembly: true}]
© 2020 NTT DATA Corporation 56参考︓JITWatch• JITコンパイルログの解析と可視化ができる• https://github.com/AdoptOpenJDK/jitwatch
© 2020 NTT DATA Corporation 57Javaバイトコードを機械語にするプロセスは︖
© 2020 NTT DATA Corporation 58JITコンパイルのプロセスJavaバイトコードIR(中間表現)機械語最適化を適⽤し、IRを変更するサイクルを繰り返す① ③②
© 2020 NTT DATA Corporation 59IR(Intermediate Representation)• コードをデータ構造で表現する• JVMでは、グラフで表現している• プログラムの依存をグラフにする• 通称 IRグラフ
© 2020 NTT DATA Corporation 60例: x + y をグラフにする
© 2020 NTT DATA Corporation 61例: getX() + getY() をグラフにする
© 2020 NTT DATA Corporation 62例: メソッドの呼び出し順序を考慮⻩⾊が実⾏順序、緑⾊がデータフロー
© 2020 NTT DATA Corporation 63JVMのIRグラフを⾒てみよう(ただし、C2ではなくGraalVM JITコンパイラ)
© 2020 NTT DATA Corporation 64IdealGraphVisualizerIRグラフ可視化ツール• ただし、GraalVM JITコンパイラ⽤• -Dgraal.Dump=:1 オプションをつけて実⾏する• https://www.graalvm.org/docs/reference-manual/tools/#ideal-graph-visualizer
© 2020 NTT DATA Corporation 65参考: C2とGraalVM JITコンパイラ• C2• OpenJDKのデフォルト• C++で書かれている• GraalVM JITコンパイラ• GraalVMのデフォルト• Javaで書かれている• OpenJDKにもポートされている (10以降)• JEP 317: Experimental Java-Based JIT Compiler
© 2020 NTT DATA Corporation 66デモIRグラフをダンプしてIGVで表⽰する
© 2020 NTT DATA Corporation 67JITコンパイルでの最適化とは、このグラフに対するパターンマッチとなるイメージ
© 2020 NTT DATA Corporation 68ものすごくラフな例Aノード BノードCノードDノード DノードEノード最適化パターンにマッチ︕
© 2020 NTT DATA Corporation 69JITコンパイラの構成バイトコードフロントエンドバックエンド機械語
© 2020 NTT DATA Corporation 70フロントエンド• ハードウェアから独⽴• バイトコードからIRを⽣成する• IRに最適化をほどこす• IRは、HIRと呼ぶ• High-Level IR: ⾼⽔準中間表現
© 2020 NTT DATA Corporation 71バックエンド• ハードウェアに依存• レジスタを割り当てる• IRから機械語を⽣成する• IRはLIRと呼ぶ• Low-Level IR: 低⽔準中間⾔語
© 2020 NTT DATA Corporation 72JITコンパイルの処理の流れクラスロードバイトコードHIRHIR LIRLIR機械語コードフロントエンド バックエンドHIR⽣成最適化 レジスタ割当コード⽣成
© 2020 NTT DATA Corporation 73o.g.compiler.core.GraalCompilerpublic static <T extends CompilationResult> Tcompile(Request<T> r) {...emitFrontEnd(r.providers, r.backend, r.graph,r.graphBuilderSuite, r.optimisticOpts,r.profilingInfo, r.suites);r.backend.emitBackEnd(r.graph, null,r.installedCodeOwner, r.compilationResult,r.factory, null, r.lirSuites);...}
© 2020 NTT DATA Corporation 74最適化• メソッドのインライン化• ループアンロール• デッドコード削除• ロック粗粒化 / ロック省略• エスケープ解析 (厳密には最適化ではない)• などなど多数
© 2020 NTT DATA Corporation 75ホットパスでのコンパイルノード ノードノードノードプロファイル結果から、左ルートを前提としたコードを⽣成する
© 2020 NTT DATA Corporation 76実⾏が右ルートに⾏く場合は︖ノード ノードノードノード⽣成したコードにあるトラップに⼊る
© 2020 NTT DATA Corporation 77脱最適化: Deoptimization• JITコンパイラが⽴てた前提から外れた実⾏となった場合• if – else if でまれな経路に⼊る• クラスロードでインタフェースの実装クラスが増える• 機械語の実⾏からインタプリタでの実⾏に戻る
© 2020 NTT DATA Corporation 78JITコンパイルのライフサイクルインタプリタコードキャッシュC1C2脱最適化
© 2020 NTT DATA Corporation 79コードキャッシュ• 機械語コードはCodeCache (C++オブジェクト)内に配置する• -XX:ReservedCodeCacheSize でキャッシュサイズを指定• デフォルトサイズは、240MB
© 2020 NTT DATA Corporation 80Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full.Compiler has been disabled.Java HotSpot(TM) 64-Bit Server VM warning: Try increasing thecode cache size using -XX:ReservedCodeCacheSize=CodeCache: size=2496Kb used=1980Kb max_used=1983Kb free=515Kbbounds [0x0000000103db8000, 0x0000000104028000,0x0000000104028000]total_blobs=1104 nmethods=623 adapters=288compilation: disabled (not enough contiguous free space left)コードキャッシュあふれ
© 2020 NTT DATA Corporation 81アプリケーションのパフォーマンスが低下する
© 2020 NTT DATA Corporation 82今回扱っていない話題• コンパイルキュー• OSR: On Stack Replacement• 各最適化⼿法の詳細• SSA: Static Single Assignment• レジスタ割付のアルゴリズム• Linear Scan Register Allocation
© 2020 NTT DATA Corporation 83まとめ• JITコンパイラ• バイトコードを機械語に変換する• HotSpot VMのJITコンパイラ• C1とC2でTiered Compilation• HSDIS(+JITWatch)• JIT⽣成コードを実際に⾒れる
© 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、⼜はサービス名は、各社の登録商標⼜は商標です

Recommended

PPTX
Metaspace
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PPTX
イベント・ソーシングを知る
PPTX
本当は恐ろしい分散システムの話
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PDF
ゼロからはじめるKVM超入門
PDF
分散トレーシング技術について(Open tracingやjaeger)
PPTX
Dockerからcontainerdへの移行
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
PPT
Glibc malloc internal
PDF
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
PDF
Pythonによる黒魔術入門
PDF
Unified JVM Logging
PDF
ドメイン駆動設計サンプルコードの徹底解説
PPTX
Redisの特徴と活用方法について
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
SAT/SMTソルバの仕組み
PPTX
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
PDF
20分でわかるgVisor入門
PDF
例外設計における大罪
PDF
Kubernetesによる機械学習基盤への挑戦
PDF
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PDF
PostgreSQLでスケールアウト
PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
PDF
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
PPTX
Introduction to JIT Compiler in JVM
PDF
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み

More Related Content

PPTX
Metaspace
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PPTX
イベント・ソーシングを知る
PPTX
本当は恐ろしい分散システムの話
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PDF
ゼロからはじめるKVM超入門
PDF
分散トレーシング技術について(Open tracingやjaeger)
PPTX
Dockerからcontainerdへの移行
Metaspace
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
イベント・ソーシングを知る
本当は恐ろしい分散システムの話
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
ゼロからはじめるKVM超入門
分散トレーシング技術について(Open tracingやjaeger)
Dockerからcontainerdへの移行

What's hot

PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
PPT
Glibc malloc internal
PDF
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
PDF
Pythonによる黒魔術入門
PDF
Unified JVM Logging
PDF
ドメイン駆動設計サンプルコードの徹底解説
PPTX
Redisの特徴と活用方法について
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
SAT/SMTソルバの仕組み
PPTX
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
PDF
20分でわかるgVisor入門
PDF
例外設計における大罪
PDF
Kubernetesによる機械学習基盤への挑戦
PDF
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PDF
PostgreSQLでスケールアウト
PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
PDF
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
コンテナの作り方「Dockerは裏方で何をしているのか?」
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Glibc malloc internal
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
Pythonによる黒魔術入門
Unified JVM Logging
ドメイン駆動設計サンプルコードの徹底解説
Redisの特徴と活用方法について
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
SAT/SMTソルバの仕組み
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
20分でわかるgVisor入門
例外設計における大罪
Kubernetesによる機械学習基盤への挑戦
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PostgreSQLでスケールアウト
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)

Similar to Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)

PPTX
Introduction to JIT Compiler in JVM
PDF
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
Adaptive optimization of JIT compiler
PDF
OpenJDK HotSpot C1Compiler Overview
PDF
JDKツール使ってますか
PDF
JVM のいろはにほ #javajo
PDF
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
PDF
JIT Code Profiling with VTune
PDF
Oracle code one 2018 報告会概要
PPTX
Panamaを先取り!? JVMCIでJITと遊ぶ
PDF
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
PDF
Froyo DalvikVM JIT
PPTX
Java 9で進化する診断ツール
PDF
20151112 kutech lecture_ishizaki_public
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
KEY
関ジャバ JavaOne Tokyo 2012報告会
PPTX
ななめ45°から見たJavaOne
Introduction to JIT Compiler in JVM
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
Adaptive optimization of JIT compiler
OpenJDK HotSpot C1Compiler Overview
JDKツール使ってますか
JVM のいろはにほ #javajo
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
JIT Code Profiling with VTune
Oracle code one 2018 報告会概要
Panamaを先取り!? JVMCIでJITと遊ぶ
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Froyo DalvikVM JIT
Java 9で進化する診断ツール
20151112 kutech lecture_ishizaki_public
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
関ジャバ JavaOne Tokyo 2012報告会
ななめ45°から見たJavaOne

More from NTT DATA Technology & Innovation

PDF
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
PDF
SAFe実践から見えた、フレームワークより大切な組織変革の道程(Scrum Fest Sendai 2025 発表資料)
PDF
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
SAFe実践から見えた、フレームワークより大切な組織変革の道程(Scrum Fest Sendai 2025 発表資料)
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
2025年現在のNewSQL (最強DB講義 #36 発表資料)
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)

Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)

  • 1.
    © 2020 NTTDATA CorporationJavaコードが速く実⾏される秘密- JITコンパイラ⼊⾨2020年11⽉7⽇ JJUG CCC 2020 Fall株式会社NTTデータ 技術開発本部阪⽥ 浩⼀
  • 2.
    © 2020 NTTDATA Corporation 2⾃⼰紹介• 阪⽥ 浩⼀(さかた -)• 通称 じゅくちょー• JVMになりたい⼈• NTTデータでJava/OpenJDK + GraalVMの研究開発とそのサポート業に従事しています• Javaチャンピオン• OpenJDK Authorjyukutyo
  • 3.
    © 2020 NTTDATA Corporation 3このセッションの役割JVMの現在の実⾏速度を実現したJITコンパイラの仕組みを(概観として)伝える
  • 4.
    © 2020 NTTDATA Corporation 4Javaアプリケーションの実⾏までの流れをおさらいしましょう
  • 5.
    © 2020 NTTDATA Corporation 5javacでのコンパイルJavaコードコンパイル(javac)クラスファイル
  • 6.
    © 2020 NTTDATA Corporation 6cafe babe 0000 0034 001d 0a00 0600 0f09 .......4........0010 0011 0800 120a 0013 0014 0700 1507 ................0016 0100 063c 696e 6974 3e01 0003 2829 .....<init>...()5601 0004 436f 6465 0100 0f4c 696e 654e V...Code...LineN756d 6265 7254 6162 6c65 0100 046d 6169 umberTable...mai6e01 0016 285b 4c6a 6176 612f 6c61 6e67 n...([Ljava/lang2f53 7472 696e 673b 2956 0100 0a53 6f75 /String;)V...Sou7263 6546 696c 6501 000f 4865 6c6c 6f57 rceFile...HelloW6f72 6c64 2e6a 6176 610c 0007 0008 0700 orld.java.......クラスファイル
  • 7.
    © 2020 NTTDATA Corporation 7メソッドの処理をJavaバイトコードで記述する
  • 8.
    © 2020 NTTDATA Corporation 8https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-7.html
  • 9.
    © 2020 NTTDATA Corporation 9Javaでのコンパイル(javac)実施タイミング アプリケーション実⾏前⼊⼒ Javaコード出⼒ Javaバイトコード
  • 10.
    © 2020 NTTDATA Corporation 10$ javap -c HelloWorldclass HelloWorld {...public static void main(java.lang.String...);Code:0: getstatic #23: ldc #35: invokevirtual #48: return}javap
  • 11.
    © 2020 NTTDATA Corporation 11JVMはクラスファイルを読み込み、アプリケーションを実⾏する
  • 12.
    © 2020 NTTDATA Corporation 12JVMは処理をどのように実⾏する︖
  • 13.
    © 2020 NTTDATA Corporation 13バイトコードをインタプリト、つまり逐次処理する
  • 14.
    © 2020 NTTDATA Corporation 14今から25年前…Javaの実⾏は遅かった
  • 15.
    © 2020 NTTDATA Corporation 15理由の1つは、すべての処理がインタプリタ実⾏だったこと
  • 16.
    © 2020 NTTDATA Corporation 16Java (J2SE) 1.3でJITコンパイルを標準で使うように
  • 17.
    © 2020 NTTDATA Corporation 17このJITコンパイルが今でもJavaの速さの主な要因
  • 18.
    © 2020 NTTDATA Corporation 18JITコンパイルの仕組みJavaバイトコードJITコンパイル機械語プロファイル情報
  • 19.
    © 2020 NTTDATA Corporation 19JITコンパイル「実⾏中」に機械語へコンパイル︕JVM
  • 20.
    © 2020 NTTDATA Corporation 20各プラットフォーム(主にCPU)の機械語を⽣成、キャッシュして実⾏する
  • 21.
    © 2020 NTTDATA Corporation 21さらに、実⾏時の情報をプロファイリングし、それを機械語⽣成に活⽤する
  • 22.
    © 2020 NTTDATA Corporation 22その結果、実⾏パフォーマンスが向上する
  • 23.
    © 2020 NTTDATA Corporation 23コードをすべてJITコンパイルしているのか︖
  • 24.
    © 2020 NTTDATA Corporation 24前提JITコンパイルはアプリケーションの実⾏中に動作するものである
  • 25.
    © 2020 NTTDATA Corporation 25トレードオフJITコンパイル処理⾃体がリソースを消費する
  • 26.
    © 2020 NTTDATA Corporation 26トレードオフのバランスを取るプロファイル情報からよく実⾏する処理(頻繁に呼ばれるメソッドなど)をコンパイル対象にする
  • 27.
    © 2020 NTTDATA Corporation 27よく実⾏する処理=ホットスポット
  • 28.
    © 2020 NTTDATA Corporation 28(おそらく今使っている) JVMHotSpot VM(OpenJDK / Oracle JDK)
  • 29.
    © 2020 NTTDATA Corporation 29さらなるトレードオフよりよい機械語を⽣成するには、より⻑いコンパイル時間が必要となる
  • 30.
    © 2020 NTTDATA Corporation 30さらなるトレードオフコンパイル時間短縮or速いコードの⽣成
  • 31.
    © 2020 NTTDATA Corporation 31HotSpot VMでは2つのJITコンパイラを使う
  • 32.
    © 2020 NTTDATA Corporation 32HotSpot VMでの2つのJITコンパイラ• C1コンパイラ• コンパイル時間が短い• それほど速くない機械語する• C2コンパイラ• 速いコードを⽣成する• コンパイル時間が⻑くなる
  • 33.
    © 2020 NTTDATA Corporation 33メソッドに対するコンパイルと呼び出し時間のイメージC2C1コンパイル時間が⻑くても、その後の処理実⾏が⾼速になり、「元が取れる」
  • 34.
    © 2020 NTTDATA Corporation 34Java歴が⻑い⼈向け昔、実⾏オプションで-server ってつけてましたよね︖
  • 35.
    © 2020 NTTDATA Corporation 35HotSpot VMでの2つのJITコンパイラ• C1コンパイラ(clientコンパイラ)• コンパイル時間が短い• それほど速くない機械語する• C2コンパイラ(serverコンパイラ)• 速いコードを⽣成する• コンパイル時間が⻑くなる
  • 36.
    © 2020 NTTDATA Corporation 36-server とは、C2コンパイラを使⽤する、という意味です
  • 37.
    © 2020 NTTDATA Corporation 37Java 8からは-server不要Tiered Compilation(階層型コンパイル)がデフォルトになったため
  • 38.
    © 2020 NTTDATA Corporation 38バイトコード C1⽣成機械語 C2⽣成機械語Tiered Compilation概要• C1とC2の両⽅を使う
  • 39.
    © 2020 NTTDATA Corporation 39JITコンパイルのログを出⼒してみよう︕
  • 40.
    © 2020 NTTDATA Corporation 40JITコンパイルのログ設定• 以下のオプションを付ける• -XX:+PrintCompilation• コンソールにコンパイルログを出⼒する
  • 41.
    © 2020 NTTDATA Corporation 41PrintCompilationの出⼒181 416 4 java.lang.AbstractStringBuilder::append (45 bytes)182 417 ! 3 java.util.zip.InflaterInputStream::read (138 bytes)182 420 n 0 java.util.zip.Inflater::inflateBytesBytes (native)182 418 3 java.util.zip.InflaterInputStream::ensureOpen (18 bytes)182 419 3 java.io.RandomAccessFile::seek (22 bytes)183 421 3 java.util.WeakHashMap::getTable (9 bytes)183 422 ! 3 java.util.WeakHashMap::expungeStaleEntries (139 bytes)184 423 3 java.util.WeakHashMap::indexFor (6 bytes)184 424 3 java.io.File::isInvalid (48 bytes)184 427 3 java.util.zip.ZipUtils::CENSIZ (9 bytes)184 428 3 java.io.UnixFileSystem::normalize (41 bytes)185 429 3 java.util.zip.ZipFile::ensureOpen (40 bytes)185 425 1 java.nio.HeapByteBuffer::isDirect (2 bytes)185 431 s 3 jdk.internal.loader.Resource::cachedInputStream (20 bytes)
  • 42.
    © 2020 NTTDATA Corporation 42デモSpringBoot起動でのJITコンパイルログ出⼒
  • 43.
    © 2020 NTTDATA Corporation 43実際のJITコンパイルログ32 5 3 java.lang.String::coder (15 bytes)...150 235 4 java.lang.String::coder (15 bytes)151 5 3 java.lang.String::coder (15 bytes) made not entrant経過時間コンパイルID最適化レベル 破棄したコンパイルしたメソッドのバイト数
  • 44.
    © 2020 NTTDATA Corporation 44JITコンパイルの最適化レベル最適化レベル: 0インタプリタ⼀般的ケースプロファイリングなしベーシックカウンタのみ詳細3 4C2が詰まっているケース 0 2 43効果が薄いメソッドのケース0 1 3C1コンパイラ C2
  • 45.
    © 2020 NTTDATA Corporation 45JITコンパイラの最適化レベル0 インタプリタ実⾏1 C1 (プロファイリングなし)2C1 (ベーシックカウンタのみプロファイリング)3 C1 (完全なプロファイリング)4 C2
  • 46.
    © 2020 NTTDATA Corporation 46$ javap -c --module java.base java.lang.String...byte coder();Code:0: getstatic3: ifeq6: aload_07: getfield10: goto13: iconst_114: ireturnメソッドのバイト数String#coder()は15バイトのメソッド︕
  • 47.
    © 2020 NTTDATA Corporation 47再掲︓実際のJITコンパイルログ32 5 3 java.lang.String::coder (15 bytes)...150 235 4 java.lang.String::coder (15 bytes)151 5 3 java.lang.String::coder (15 bytes) made not entrant経過時間コンパイルID最適化レベル 破棄したコンパイルしたメソッドのバイト数
  • 48.
    © 2020 NTTDATA Corporation 48JITコンパイルのログ設定• 以下のオプションを付ける• -XX:+PrintCompilation• コンソールにコンパイルログを出⼒する• Unified JVM Loggingでも出⼒できます• -Xlog:jit+compilation=debug
  • 49.
    © 2020 NTTDATA Corporation 49JITコンパイラがコンパイルしたメソッドはわかったけど⽣成した機械語も⾒たい︕
  • 50.
    © 2020 NTTDATA Corporation 50たとえばこういったケース• あるメソッドがJITコンパイルされているか確認したい• パフォーマンスに⼤きく影響するメソッドである場合• 実⾏中のどの時点でJITコンパイルされたかが重要な場合• オプションの変更による影響を確認する場合
  • 51.
    © 2020 NTTDATA Corporation 51HSDIS(HotSpot Disassembler)• JIT⽣成の機械語をアセンブリに変換して出⼒するライブラリ• HotSpot VM⽤(通常のOpenJDKとOracle JDK)• OpenJDKに含まれている• src/utils/hsdis ディレクトリで⾃分でビルドする• ビルド⼿順参考︓https://www.slideshare.net/nttdata-tech/java-maximize-cpu-2019-nttdata-suenaga• HSDISをビルドし、JDKに配置する• [JAVA_HOME]/lib ディレクトリ• 以下のオプションを付けて起動する• -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
  • 52.
    © 2020 NTTDATA Corporation 52HSDISの出⼒Demo2.workload(I)I (Demo2.workload(int)) [0x000000010b997b20, 0x000000010b997b60] 64 bytes[Entry Point][Constants]# {method} {0x000000012709faf8} 'workload' '(I)I' in 'Demo2'# this: rsi:rsi = 'Demo2'# parm0: rdx = int# [sp+0x10] (sp of caller)0x000000010b997b20: mov 0x8(%rsi),%r10d0x000000010b997b24: shl $0x3,%r100x000000010b997b28: cmp %r10,%rax0x000000010b997b2b: jne 0x000000010b92f000 ; {runtime_call ic_miss_stub}0x000000010b997b31: nop0x000000010b997b32: nopl 0x0(%rax)0x000000010b997b39: nopl 0x0(%rax)[Verified Entry Point]0x000000010b997b40: nopl 0x0(%rax,%rax,1)0x000000010b997b45: inc %edx ;*iadd {reexecute=0 rethrow=0 return_oop=0}; - Demo2::workload@2 (line 9)0x000000010b997b47: mov %edx,%eax ;*ireturn {reexecute=0 rethrow=0 return_oop=0}
  • 53.
    © 2020 NTTDATA Corporation 53デモSpringBoot起動時のアセンブリ表⽰
  • 54.
    © 2020 NTTDATA Corporation 54読みやすいとは⾔えません
  • 55.
    © 2020 NTTDATA Corporation 55出⼒するメソッドを指定できる• CompileOnlyオプションを付与する• -XX:CompileOnly=String::startsWith -XX:CompileCommand=quiet• コンパイラディレクティブを使う1. JSONファイルで対象を指定する2. -XX:+UnlockDiagnosticVMOptions -XX:CompilerDirectivesFile=directive.json[{match: "java/lang/String.*",PrintAssembly: true}]
  • 56.
    © 2020 NTTDATA Corporation 56参考︓JITWatch• JITコンパイルログの解析と可視化ができる• https://github.com/AdoptOpenJDK/jitwatch
  • 57.
    © 2020 NTTDATA Corporation 57Javaバイトコードを機械語にするプロセスは︖
  • 58.
    © 2020 NTTDATA Corporation 58JITコンパイルのプロセスJavaバイトコードIR(中間表現)機械語最適化を適⽤し、IRを変更するサイクルを繰り返す① ③②
  • 59.
    © 2020 NTTDATA Corporation 59IR(Intermediate Representation)• コードをデータ構造で表現する• JVMでは、グラフで表現している• プログラムの依存をグラフにする• 通称 IRグラフ
  • 60.
    © 2020 NTTDATA Corporation 60例: x + y をグラフにする
  • 61.
    © 2020 NTTDATA Corporation 61例: getX() + getY() をグラフにする
  • 62.
    © 2020 NTTDATA Corporation 62例: メソッドの呼び出し順序を考慮⻩⾊が実⾏順序、緑⾊がデータフロー
  • 63.
    © 2020 NTTDATA Corporation 63JVMのIRグラフを⾒てみよう(ただし、C2ではなくGraalVM JITコンパイラ)
  • 64.
    © 2020 NTTDATA Corporation 64IdealGraphVisualizerIRグラフ可視化ツール• ただし、GraalVM JITコンパイラ⽤• -Dgraal.Dump=:1 オプションをつけて実⾏する• https://www.graalvm.org/docs/reference-manual/tools/#ideal-graph-visualizer
  • 65.
    © 2020 NTTDATA Corporation 65参考: C2とGraalVM JITコンパイラ• C2• OpenJDKのデフォルト• C++で書かれている• GraalVM JITコンパイラ• GraalVMのデフォルト• Javaで書かれている• OpenJDKにもポートされている (10以降)• JEP 317: Experimental Java-Based JIT Compiler
  • 66.
    © 2020 NTTDATA Corporation 66デモIRグラフをダンプしてIGVで表⽰する
  • 67.
    © 2020 NTTDATA Corporation 67JITコンパイルでの最適化とは、このグラフに対するパターンマッチとなるイメージ
  • 68.
    © 2020 NTTDATA Corporation 68ものすごくラフな例Aノード BノードCノードDノード DノードEノード最適化パターンにマッチ︕
  • 69.
    © 2020 NTTDATA Corporation 69JITコンパイラの構成バイトコードフロントエンドバックエンド機械語
  • 70.
    © 2020 NTTDATA Corporation 70フロントエンド• ハードウェアから独⽴• バイトコードからIRを⽣成する• IRに最適化をほどこす• IRは、HIRと呼ぶ• High-Level IR: ⾼⽔準中間表現
  • 71.
    © 2020 NTTDATA Corporation 71バックエンド• ハードウェアに依存• レジスタを割り当てる• IRから機械語を⽣成する• IRはLIRと呼ぶ• Low-Level IR: 低⽔準中間⾔語
  • 72.
    © 2020 NTTDATA Corporation 72JITコンパイルの処理の流れクラスロードバイトコードHIRHIR LIRLIR機械語コードフロントエンド バックエンドHIR⽣成最適化 レジスタ割当コード⽣成
  • 73.
    © 2020 NTTDATA Corporation 73o.g.compiler.core.GraalCompilerpublic static <T extends CompilationResult> Tcompile(Request<T> r) {...emitFrontEnd(r.providers, r.backend, r.graph,r.graphBuilderSuite, r.optimisticOpts,r.profilingInfo, r.suites);r.backend.emitBackEnd(r.graph, null,r.installedCodeOwner, r.compilationResult,r.factory, null, r.lirSuites);...}
  • 74.
    © 2020 NTTDATA Corporation 74最適化• メソッドのインライン化• ループアンロール• デッドコード削除• ロック粗粒化 / ロック省略• エスケープ解析 (厳密には最適化ではない)• などなど多数
  • 75.
    © 2020 NTTDATA Corporation 75ホットパスでのコンパイルノード ノードノードノードプロファイル結果から、左ルートを前提としたコードを⽣成する
  • 76.
    © 2020 NTTDATA Corporation 76実⾏が右ルートに⾏く場合は︖ノード ノードノードノード⽣成したコードにあるトラップに⼊る
  • 77.
    © 2020 NTTDATA Corporation 77脱最適化: Deoptimization• JITコンパイラが⽴てた前提から外れた実⾏となった場合• if – else if でまれな経路に⼊る• クラスロードでインタフェースの実装クラスが増える• 機械語の実⾏からインタプリタでの実⾏に戻る
  • 78.
    © 2020 NTTDATA Corporation 78JITコンパイルのライフサイクルインタプリタコードキャッシュC1C2脱最適化
  • 79.
    © 2020 NTTDATA Corporation 79コードキャッシュ• 機械語コードはCodeCache (C++オブジェクト)内に配置する• -XX:ReservedCodeCacheSize でキャッシュサイズを指定• デフォルトサイズは、240MB
  • 80.
    © 2020 NTTDATA Corporation 80Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full.Compiler has been disabled.Java HotSpot(TM) 64-Bit Server VM warning: Try increasing thecode cache size using -XX:ReservedCodeCacheSize=CodeCache: size=2496Kb used=1980Kb max_used=1983Kb free=515Kbbounds [0x0000000103db8000, 0x0000000104028000,0x0000000104028000]total_blobs=1104 nmethods=623 adapters=288compilation: disabled (not enough contiguous free space left)コードキャッシュあふれ
  • 81.
    © 2020 NTTDATA Corporation 81アプリケーションのパフォーマンスが低下する
  • 82.
    © 2020 NTTDATA Corporation 82今回扱っていない話題• コンパイルキュー• OSR: On Stack Replacement• 各最適化⼿法の詳細• SSA: Static Single Assignment• レジスタ割付のアルゴリズム• Linear Scan Register Allocation
  • 83.
    © 2020 NTTDATA Corporation 83まとめ• JITコンパイラ• バイトコードを機械語に変換する• HotSpot VMのJITコンパイラ• C1とC2でTiered Compilation• HSDIS(+JITWatch)• JIT⽣成コードを実際に⾒れる
  • 84.
    © 2020 NTTDATA Corporation本資料に記載されている会社名、商品名、⼜はサービス名は、各社の登録商標⼜は商標です

[8]ページ先頭

©2009-2025 Movatter.jp