jvm関連の最近の出来事〜graalとopenj9〜

78
JVM関連の 最近の出来事 ~Graal/OpenJ9~ 関西Javaエンジニアの会 / ポノス株式会社 阪田 浩一 @jyukutyo #kanjava

Upload: koichi-sakata

Post on 21-Jan-2018

2.342 views

Category:

Technology


2 download

TRANSCRIPT

JVM関連の最近の出来事~Graal/OpenJ9~

関西Javaエンジニアの会 /

ポノス株式会社

阪田浩一 @jyukutyo

#kanjava

会長だけどじゅくちょー

阪田浩一

通称: じゅくちょー

関ジャバ会長

JVMが大好き

ポノス株式会社(スマホゲーム会社)

私の検索

• Graal

• J9

• JIT

• HotSpot

• JVM

• GC

今日は

GraalとOpenJ9で

“聴いたこと”を

話します

理解しきれておらず

誤ったことを言う

可能性もあります

(フォローお願い)

Graal

Graal

• HotSpotでの新しいJITコンパイラ

• Java 9でexperimental

• Javaで記述されている

• 他言語のサポート– http://www.oracle.com/technetwork/oracle-labs/program-languages/overview/index.html

Twitterは

すでに本番環境で

Graalを使用している

Twitterは

独自のJDKを

持っている

(OpenJDK 8ベース)

Twitter custom JDK

• Graal

• JEP-243 JVMCIのバックポート

• Contrail (JFRの代替)

• 改善したCMS

Graal VM

• JVM

• GraalをJITコンパイラとして使う

• Truffle (後述)を含む

• このVM上で動作する他言語(JSやRuby、R)を含む - Polyglot

HotSpot VM

Compiler Interface

C2C1

HotSpot VM

C++

Graal VM

Compiler Interface

GraalC1

HotSpot VM

JVMCI

Java

$ 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>

Graal VM上の言語は

相互に呼び出し可能

Ruby> Truffle::Interop.eval('application/javascript', '14 + 6')

20

JavaScript> Interop.eval('ruby', '"100".to_i')

100

デモ

Truffle

• 言語実装用フレームワーク

• ASTインタプリタとして言語を実装できる– Truffle APIを用いて実装する

Truffleでの多言語環境

HotSpot VM

JVMCI

Graal

JVM lang Truffle

LLVMJS R Ruby

C C++ Fortran

インタープリタ

Truffleで言語実装してみた

• https://github.com/jyukutyo/JVM-Math-Language

続きはJJUG CCCで!

Graal & Truffle

• Graalは言語実装そのものは知らない– Truffleを間に挟んでいる(JVM言語以外)

• JITコンパイルでは(結果として)複数言語にまたがったコンパイルができる

call call

call many times

プロファイリングし

ホットな部分を

JITコンパイル

call call

もちろん

必要に応じて

Deoptimization

します

パフォーマンス

• いいらしい– JS(Graal.js) V8の1.5倍

– Ruby(RubyTruffle) Jrubyの1.5〜4.5倍

– R(FastR) Gnu Rの2〜39倍

小まとめ

• Graalは新しいJITコンパイラ

• Graal VMは多言語プラットフォーム

• Truffleは言語実装用フレームワーク

OpenJ9

JVMの実装

• HotSpot VM

• Eclipse OpenJ9

• FJVM

• 日立JavaVM

• Zing

• (Jrockit JVM)

• Jikes RVMなど研究用

Javaエンジニアとしては

JVMの実装も

アプリケーションに

合わせて選択したい(?)

OpenJ9

• IBMがJVM“J9”をEclipse ファウンデーションに寄贈した–つまりオープンソース化した

– https://www.eclipse.org/openj9/

• Apache 2.0/Eclipse Public License 2.0

–デュアルライセンス

OpenJDKで

HotSpotではなく

OpenJ9を使用する

現時点では

Linuxのみ

サポート

Mac OSは近々?

J9の特徴

• 適応型コンパイル(6レベル) 1999

• スタック割り当て 2001

• クラス共有 2005

• Metronome ソフトリアルタイムGC (GCポーズが1msから) 2006

• 動的事前コンパイル 2007

• 圧縮参照 2007

J9の特徴

• アイドル時間最適化 2007

• リージョンベースの安定したGC 2011

• JITコンパイラでのハードウェアトランザクショナルメモリサポート 2013

• JITコンパイラでの自動ベクタ化と自動並列化 2014

• ポーズレスGCサポート(z14) 2017

使用する

(補足)

Eclipse OMR

• 言語ランタイム開発用コンポーネント

– 2016年にIBMがオープンソース化した

– Javaに限らずRubyやPythonもOMRを使い実験的に実装している

Eclipse OMR

• 言語ランタイム開発用コンポーネント

–言語によくある機能をコンポーネントに

• JIT

• GC

• 診断/モニタリング

• プラットフォーム抽象化

https://www.slideshare.net/MarkStoodley/javaone-2017-mark-stoodley-open-sourcing-ibm-j9-jvm

OpenJ9では

クラスファイルを

扱いやすく

https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm

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)

https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm

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

https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm

クラス・データ共有

https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm

ROMClassを共有

https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm

メリット:

起動が早い

フットプリントが小さい

JEP 310:

Application

Class-Data Sharing

(既存のCDSを拡張)

https://www.slideshare.net/MarkStoodley/javaone-2017-mark-stoodley-open-sourcing-ibm-j9-jvm

https://www.slideshare.net/DanHeidinga/j9-under-the-hood-of-the-next-open-source-jvm

Ahead-Of-Time (AOT)コンパイル

• OpenJDK/OracleJDK 9にexperimentalで含まれる

• Linuxのみ

– Libelfへの依存があるため

• jaotcコマンド

https://github.com/eclipse/openj9-website/blob/master/benchmark/daytrader3.md

Ahead-Of-Time (AOT) enabled

• -Xshareclasses–クラス共有を使用可能にする

• -Xscmx60M –キャッシュ・サイズを指定

• -Xscmaxaot8M– AOT データに使用できるクラス・キャッシュでの最大バイト数

J9のツール

• DDR(Direct Dump Reader)– J9用コアダンプ解析ツール

– DDR Interactiveというフロントエンドがある

DDRは

まだOpenJ9では

ビルドできなさそう

https://www.slideshare.net/Dev_Events/secrets-of-building-a-debuggable-runtime-learn-how-language-implementors-solve-your-runtime-issues

ビルドしようとした…

• 昨日はうまくいかなかった

• EclipseのAntでのビルド必須– antcontrib/antformがいる

• IBMのライブラリがいる–リポジトリに入っていない

今日は

IBM SDKに含まれている

DDRを使って

デモします

デモ

(前提:コアダンプを

取っていること)

$ 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

> threads

> stackslots

> j9object

> 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”

}

DDRが提供すること

• そのアドレスの構造を出力する

– j9object/j9method

• その他情報を出力する

– stackslots

• ユーティリティ

– classforname/findpattern/whatis

• データ解析

– gccheck/デッドロック

僕のような

GDB弱者には

やさしいかも…

小まとめ

• OpenJ9はオープンソースJVM–もとはIBMのJVM

• HotSpotとは仕組みが異なる

• DDRはコアダンプ解析ツール

ご清聴

ありがとうございました