Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

jvm

JVMのControl Flow Graph可視化

jvm

GraalでのOSRを見たとき、"Control Flow Graph: 制御フローグラフ"(CFG)が出てきました。 Register AllocationとCFGは密接に関わります。さて、JavaでのCFGを検索すると論文が出てきました。 Thomas Würthingerさんの"Visualization of Java Control Flow …

GraalでのOSR

jvm

以前JITコンパイルでのOSR(on-stack replacement)について見ました。 jyukutyo.hatenablog.com 次は、GraalでのOSRの実装を見てみます。org.graalvm.compiler.hotspot.phases.OnStackReplacementPhaseです。各Phaseクラスではrun(StructuredGraph)を実装し…

JITコンパイルでのOSRとは

jvm

JITコンパイルのログなどを見ると、OSR(on-stack replacement)という単語が出てきます。このブログでも以前JITWatchを触ったときに少し書きました。 OSRはOn-Stack replacementのことで、ループ内の最適化のことを指します。 jyukutyo.hatenablog.com で、…

Java 8リリース以降のG1GCに対する改善

jvm

JavaOne 2017のセッションで、Java 8のリリース以降に実施されたG1GCの改善を解説するものがありました。 youtu.be 主要な改善は5つあります。 String deduplication (JDK 8u20) Class unloading with concurrent mark (JDK 8u40) Eagerly reclaim humongous…

JITWatchが進化してる

jvm

JITWatchはJITコンパイルを可視化し分析するためのツールなのですが、これは2014年にこのブログにも書きました。 jyukutyo.hatenablog.com Twitterでこのツイートを見て、新機能を知りました。 New #JITWatch visualisations! See compiler thread queues, t…

英語論文を初めて読み終えた話

Christian Wimmerさんの"Linear Scan Register Allocation for the Java HotSpot™ Client Compiler"、約110ページを読み終えました。 http://www.christianwimmer.at/Publications/Wimmer04a/Wimmer04a.pdf オーストリアのヨハネス・ケプラー大学での修士論…

インナークラスからアウタークラスのprivateメソッドへのアクセスでの奇妙なバイトコード

JVM Language Summit 2017のセッション動画を見ていると、おもしろいコードがありました。 youtu.be JEP 181: Introduce "nests" as an explicit access control contextに関するセッションです。 こんな感じのコードです。mainメソッドは僕が追加しています…

GraalでのTrace Register Allocation

Graalのレジスタ割り付けアルゴリズムはlinear scan allocationでした。 jyukutyo.hatenablog.com ただ、org.graalvm.compiler.lir.phases.AllocationStageクラスを見ていると、こういうコードでした。 public class AllocationStage extends LIRPhaseSuite<AllocationContext> </allocationcontext>…

GraalのRegister Allocation

今まで Understanding How Graal Works - a Java JIT Compiler Written in Java に沿ってGraalの理解を深めていたのですが、記事の最後に"Some practicalities that I haven’t talked about"として2つ挙げられています。 Register allocation Scheduling こ…

GraalでのHIRとLIR

jvm

Understanding How Graal Works - a Java JIT Compiler Written in Java に沿って、Graalの理解を深めてきました。前回はロック粗粒化、記事の最後の解説でした。 jyukutyo.hatenablog.com これからは少しづつ自分で調べていきます。Graalがというかコンパイ…

JITコンパイルのコードにあるGCアルゴリズムの分岐

jvm

JJUG CCC 2017 Fallで一番楽しみにしていたセッション(そして素晴らしいセッションでした)"CPUから見たG1GC"で、初めて知ったことがありました。 CPUから見たG1GC from Kenji Kazumura www.slideshare.net JITコンパイルのコードの中に、使っているGCアル…

Graalでのロック粗粒化

前回はGraalでの大域的値番号付けでした。 jyukutyo.hatenablog.com こちらの記事に沿ってGraalの理解を深めます。 Understanding How Graal Works - a Java JIT Compiler Written in Java 今回はロック粗粒化(Lock coarsening)です。同一のモニタに対して…

Graalのノードの正規化

前回はマシンコードの生成処理を見ました。 jyukutyo.hatenablog.com この記事に沿ってGraalの理解を深めています。 Understanding How Graal Works - a Java JIT Compiler Written in Java 今回はグラフを最適化することでより効率的なコードを生成する、と…

Graalのノードからマシンコードの生成

jvm

前回はグラフノードの生成を見ました。 jyukutyo.hatenablog.com この記事に沿ってGraalの理解を深めています。 Understanding How Graal Works - a Java JIT Compiler Written in Java 最終的には、グラフにある各ノードに対してマシンコードを生成します(…

GraalでのJavaバイトコードからグラフの生成

前回はGraalのグラフを見ました。 jyukutyo.hatenablog.com 実際にどのようにグラフを作るかという謎はありますが、視点を変えて実際にJavaバイトコードをマシンコードに変換する部分を見てみます。 Chris Seatonさんの記事に沿ってGraalの理解を深めます。 …

Graalのグラフ

こちらの内容に沿って、Graalの理解を深めています。 Understanding How Graal Works - a Java JIT Compiler Written in Java 前回はGraalにJITコンパイルをさせました。 jyukutyo.hatenablog.com 今回はGraalのグラフについてです。いわゆるプログラム依存…

JITコンパイルが使うコードキャッシュ

jvm

前回JITコンパイラで"コンパイルしたコードは戻り値で返すのではなくコードキャッシュにインストールする"と書きました。 jyukutyo.hatenablog.com ではコードキャッシュとは何でしょう?単純化して言うとJITコンパイル後のマシンコードをキャッシュする場所…

Graalが使うJVMCIとは

前回ではGraalをJITコンパイラとして使うため、EnableJVMCIでJVMCIを有効にしました。 jyukutyo.hatenablog.com 引き続き Understanding How Graal Works - a Java JIT Compiler Written in Java を参考に、Graalの理解を深めます。 ところでJVMCIとは何なの…

GraalでJITコンパイルする

きしださんに教えていただいた、Graalについての非常によい入門記事があります。 Understanding How Graal Works - a Java JIT Compiler Written in Java Graalの上のTruffleでのRuby実装であるTruffleRubyを開発しているChris Seatonさんのブログです。この…

Java 9では"-XX:CompileOnly"は"-XX:CompileCommand=quiet"と組み合わせでおこう

jvm

前回のの投稿で、Java 8と9ではjava -XX:+PrintCompilation -XX:CompileOnly=xxxの出力が異なると書きました。 jyukutyo.hatenablog.com すると、OpenJDK Reviewerである末永さんからヒントをいただきました。 Excluding compileって特徴的ですね。これでHot…

Java 9から"-XX:CompileOnly"の出力が違ってるけどどうして?

Java 9とJava 8では-XX:CompileOnlyでの出力が異なってる…すごく大量に出力されるようになってる。 理由やここに仕様が載ってるよ、という方がいればぜひ教えてください!! 対象クラス class Demo { public static void main(String[] args) { while (true)…

Graalをビルドした

Graalはこちらからダウンロードできるのですが、 Oracle Labs GraalVM: Download ソースを読むついでにビルドしました。 Graalとmxが要ります。Graalはバージョン0.29を使います。 $ git clone https://github.com/graalvm/graal.git $ cd ../graal $ git ch…

OpenJDKのビルドに関するドキュメントがあった!

OpenJDKビルドの前回のエントリ jyukutyo.hatenablog.com で、--disable-warnings-as-errorsについて、 このオプションの公式な説明を検索しましたがうまくヒットせず と書いたところ、OpenJDK Authorの久保田さんから教えていただけました! https://t.co/K…

OpenJDKビルド時に設定するオプション

前回panamaビルド時にいろいろとオプションを設定しました。 jyukutyo.hatenablog.com が、よりよい方法をOpenJDK Reviewerである末永さんに教えていただきました!--disable-warnings-as-errorsをつければOKです。 bash ./configure --disable-warnings-as-…

macOSでOpenJDK(panama)ビルドするとエラーになってたのをクリアしてビルドし、Vector APIを試す

前回amberはビルドできたのですが、panamaはmakeでエラーになりました。 jyukutyo.hatenablog.com 今回panamaもビルドしてVector APIを試すことができました。 結論 configureでオプションを付ける。つまり、エラーを無視しているだけである。 $ bash ./conf…

macOSでOpenJDK(amber)ビルドするとエラーになってたのをクリアしてビルドした

OpenJDKのビルド方法そのものはきしださんのブログをご覧ください。 d.hatena.ne.jp JavaOneから帰国後、僕も最新のOpenJDKビルドするぞ!とmakeしてたのですが、エラーが出てちょっと挫折していました。 /Users/jyukutyo/code/amber/src/hotspot/share/logg…

JavaOne 2017 5日目 #JavaOne #j1jp

Java Community Keynote コミュニティキーノートは、技術的な内容ではありません。Javaコミュニティのメンバーによる演劇ですが、これがまたおもしろい!!Javaに関するウィットに富んだ内容となっています。今年はマトリックスがモチーフでした(昨年はスタ…

JavaOne 2017 2日目 #JavaOne #j1jp

Java Keynote 昨年のキーノートでは"火星の悪夢"があったことをご存知の方も多いでしょう。Javaと関係のない火星の話が1時間もあるという悪夢のキーノートでした。 今年は、そつなくまとまっていて合格点はある気がします。3年連続3度目のJavaOneでしたが、…

オレオレJVM言語を作ろう! How to create a new JVM language #Graal #Truffle

DevoxxUSに参加した際、とてもおもしろかったセッションがありました。Oleg Šelajevの"How to create a new JVM language"というセッションです。 www.youtube.com OlegはvJUG(virtual JUG: オンライン上の仮想Java User Group)のOrganiser、JRebelやXRebe…

How to get an application class loader in Java Agent method

In Java Agent method, such as premain() or agentmain(), class loader is system classloader, not application class loader. If you intent to change bytecode of class loaded by application class loader, you will need an application class load…