Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

JVM関連の最近の出来事〜GraalとOpenJ9〜

7,372 views

Published on

2017/10/29(土)
関西Javaエンジニアの会「JavaOne 2017報告会 in 大阪」
使用したスライドです。
GraalやTruffleの紹介、OpenJ9の概要とDDRのデモです。

Published in: Technology

JVM関連の最近の出来事〜GraalとOpenJ9〜

  1. 1. JVM関連の 最近の出来事 ~Graal/OpenJ9~ 関西Javaエンジニアの会 / ポノス株式会社 阪田 浩一 @jyukutyo #kanjava
  2. 2. 会長だけどじゅくちょー 阪田 浩一 通称: じゅくちょー 関ジャバ会長 JVMが大好き ポノス株式会社(スマホゲーム会社)
  3. 3. 私の検索 • Graal • J9 • JIT • HotSpot • JVM • GC
  4. 4. 今日は GraalとOpenJ9で “聴いたこと”を 話します
  5. 5. 理解しきれておらず 誤ったことを言う 可能性もあります (フォローお願い)
  6. 6. Graal
  7. 7. Graal • HotSpotでの新しいJITコンパイラ • Java 9でexperimental • Javaで記述されている • 他言語のサポート – http://www.oracle.com/technetwork/oracle-labs/program-languages/overview/index.html
  8. 8. Twitterは すでに本番環境で Graalを使用している
  9. 9. Twitterは 独自のJDKを 持っている (OpenJDK 8ベース)
  10. 10. Twitter custom JDK • Graal • JEP-243 JVMCIのバックポート • Contrail (JFRの代替) • 改善したCMS
  11. 11. Graal VM • JVM • GraalをJITコンパイラとして使う • Truffle (後述)を含む • このVM上で動作する他言語(JSや Ruby、R)を含む - Polyglot
  12. 12. HotSpot VM Compiler Interface C2C1 HotSpot VM C++
  13. 13. Graal VM Compiler Interface GraalC1 HotSpot VM JVMCI Java
  14. 14. $ graalvm-0.28.2/bin/polyglot –shell GraalVM MultiLanguage Shell 0.28.2 Copyright (c) 2013-7, Oracle and/or its affiliates JavaScript version 0.9 Ruby version 2.3.3 Usage: Use Ctrl+L to switch language and Ctrl+D to exit. Enter -usage to get a list of available commands. JavaScript>
  15. 15. Graal VM上の言語は 相互に呼び出し可能
  16. 16. Ruby> Truffle::Interop.eval('application/javascript', '14 + 6') 20 JavaScript> Interop.eval('ruby', '"100".to_i') 100
  17. 17. デモ
  18. 18. Truffle • 言語実装用フレームワーク • ASTインタプリタとして言語を 実装できる – Truffle APIを用いて実装する
  19. 19. Truffleでの多言語環境 HotSpot VM JVMCI Graal JVM lang Truffle LLVMJS R Ruby C C++ Fortran インタープリタ
  20. 20. Truffleで言語実装してみた • https://github.com/jyukutyo/JVM-Math-Language
  21. 21. 続きはJJUG CCCで!
  22. 22. Graal & Truffle • Graalは言語実装そのものは知らない – Truffleを間に挟んでいる(JVM言語以外) • JITコンパイルでは(結果として) 複数言語にまたがったコンパイルが できる
  23. 23. call call call many times
  24. 24. プロファイリングし ホットな部分を JITコンパイル
  25. 25. call call
  26. 26. もちろん 必要に応じて Deoptimization します
  27. 27. パフォーマンス • いいらしい – JS(Graal.js) V8の1.5倍 – Ruby(RubyTruffle) Jrubyの1.5〜4.5倍 – R(FastR) Gnu Rの2〜39倍
  28. 28. 小まとめ • Graalは新しいJITコンパイラ • Graal VMは多言語プラットフォーム • Truffleは言語実装用フレームワーク
  29. 29. OpenJ9
  30. 30. JVMの実装 • HotSpot VM • Eclipse OpenJ9 • FJVM • 日立JavaVM • Zing • (Jrockit JVM) • Jikes RVMなど研究用
  31. 31. Javaエンジニアとしては JVMの実装も アプリケーションに 合わせて選択したい (?)
  32. 32. OpenJ9 • IBMがJVM“J9”をEclipse ファウンデーションに寄贈した – つまりオープンソース化した – https://www.eclipse.org/openj9/ • Apache 2.0/Eclipse Public License 2.0 – デュアルライセンス
  33. 33. OpenJDKで HotSpotではなく OpenJ9を使用する
  34. 34. 現時点では Linuxのみ サポート
  35. 35. Mac OSは近々?
  36. 36. J9の特徴 • 適応型コンパイル(6レベル) 1999 • スタック割り当て 2001 • クラス共有 2005 • Metronome ソフトリアルタイムGC (GCポーズが1msから) 2006 • 動的事前コンパイル 2007 • 圧縮参照 2007
  37. 37. J9の特徴 • アイドル時間最適化 2007 • リージョンベースの安定したGC 2011 • JITコンパイラでのハードウェアトラ ンザクショナルメモリサポート 2013 • JITコンパイラでの自動ベクタ化と 自動並列化 2014 • ポーズレスGCサポート(z14) 2017
  38. 38. 使用する
  39. 39. (補足)
  40. 40. Eclipse OMR • 言語ランタイム開発用コンポーネント – 2016年にIBMがオープンソース化した – Javaに限らずRubyやPythonもOMRを使い 実験的に実装している
  41. 41. Eclipse OMR • 言語ランタイム開発用コンポーネント – 言語によくある機能をコンポーネントに • JIT • GC • 診断/モニタリング • プラットフォーム抽象化
  42. 42. https://www.slideshare.net/MarkStoodley/javaone-2017-mark-stoodley-open-sourcing-ibm-j9-jvm
  43. 43. OpenJ9では クラスファイルを 扱いやすく
  44. 44. https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm
  45. 45. J9ROMClass at 0x7f19b1a2a498 { Fields for J9ROMClass: 0x0: U32 romSize = 0x0000E510 (58640) 0x4: U32 singleScalarStaticCount = 0x00000007 (7) 0x8: J9SRP(struct J9UTF8) className = !j9utf8 0x00007F19B1A266F6 0xc: J9SRP(struct J9UTF8) superclassName = !j9utf8 0x00007F19B1A26608 0x10: U32 modifiers = 0x00000031 (49) 0x14: U32 extraModifiers = 0x0C800000 (209715200) 0x18: U32 interfaceCount = 0x00000003 (3)
  46. 46. https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm
  47. 47. J9Class at 0x87ca00 { Fields for J9Class: 0x0: UDATA eyecatcher = 0x0000000099669966 (2573637990) 0x8: struct J9ROMClass * romClass = !j9romclass 0x00007F19B1A2A498 0x10: struct J9Class ** superclasses = !j9x 0x000000000087C738 0x18: UDATA classDepthAndFlags = 0x00000000008E0001 (9306113) 0x20: U32 classDepthWithFlags = 0x00000000 (0) 0x24: U32 classFlags = 0x00000000 (0) 0x28: struct J9ClassLoader * classLoader = !j9classloader 0x00007F19C80821D8
  48. 48. https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm
  49. 49. クラス・データ共有
  50. 50. https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm
  51. 51. ROMClassを共有
  52. 52. https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm
  53. 53. メリット: 起動が早い フットプリントが小さい
  54. 54. JEP 310: Application Class-Data Sharing (既存のCDSを拡張)
  55. 55. https://www.slideshare.net/MarkStoodley/javaone-2017-mark-stoodley-open-sourcing-ibm-j9-jvm
  56. 56. https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm
  57. 57. Ahead-Of-Time (AOT)コンパイル • OpenJDK/OracleJDK 9にexperimental で含まれる • Linuxのみ – Libelfへの依存があるため • jaotcコマンド
  58. 58. https://github.com/eclipse/openj9-website/blob/master/benchmark/daytrader3.md
  59. 59. Ahead-Of-Time (AOT) enabled • -Xshareclasses – クラス共有を使用可能にする • -Xscmx60M – キャッシュ・サイズを指定 • -Xscmaxaot8M – AOT データに使用できる クラス・キャッ シュでの最大バイト数
  60. 60. J9のツール • DDR(Direct Dump Reader) – J9用コアダンプ解析ツール – DDR Interactiveという フロントエンドがある
  61. 61. DDRは まだOpenJ9では ビルドできなさそう
  62. 62. https://www.slideshare.net/Dev_Events/secrets-of-building-a-debuggable-runtime-learn-how-language-implementors-solve-your-runtime-issues
  63. 63. ビルドしようとした… • 昨日はうまくいかなかった • EclipseのAntでのビルド必須 – antcontrib/antformがいる • IBMのライブラリがいる – リポジトリに入っていない
  64. 64. 今日は IBM SDKに含まれている DDRを使って デモします
  65. 65. デモ (前提:コアダンプを 取っていること)
  66. 66. $ cd ibm-java-x86_64-80/jre/lib/ddr $ java -cp j9ddr.jar:../ext/dtfj.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.2999 *0 : PID: 2999; !j9javavm 0x7f19c80127c0Run !j9help to see a list of commands > j9help <struct> <address> Format <struct> at <address> ac <address> [ xrefs | ownedRegions ] Dump allocation context details acforobject <address> Find allocation context which owns the specified object
  67. 67. > threads > stackslots > j9object
  68. 68. > j9object 0xe0003260 J9VMJavaLangString at 0x00000000E0003260 { struct J9Class* clazz = !j9class 0x881B00 // java/lang/String Object flags = 0x00000020; [C value = !fj9object 0xe0003270 (offset=0) (java/lang/String) I count = 0x00000004 (offset=4) (java/lang/String) I hashCode = 0x003305B9 (offset=8) (java/lang/String) "main” }
  69. 69. DDRが提供すること • そのアドレスの構造を出力する – j9object/j9method • その他情報を出力する – stackslots • ユーティリティ – classforname/findpattern/whatis • データ解析 – gccheck/デッドロック
  70. 70. 僕のような GDB弱者には やさしいかも…
  71. 71. 小まとめ • OpenJ9はオープンソースJVM – もとはIBMのJVM • HotSpotとは仕組みが異なる • DDRはコアダンプ解析ツール
  72. 72. ご清聴 ありがとうございました

×