Fight the Future

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

Fiber - Project Loom

Project Loomをご存知でしょうか? http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html Project Loomは軽量スレッドであるFiberと、継続(Continuation)をJavaに導入することを狙っています。Project Loomはまだ提案されたばかりで、OpenJDKの…

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

jvm

今回はGraalのJavaバイトコードからグラフ生成の処理を、JVMCIコンパイラの実装クラスであるorg.graalvm.compiler.hotspot.HotSpotGraalCompilerから見ていきます。 /** * Gets a graph produced from the intrinsic for a given method that can be compile…

GraalでAOTする

GraalでAOT(Ahead Of Time)コンパイルしました。GraalはJava 9でのAOT実装としても使われています。Java 9ではLinuxのみjaotcコマンドがありAOTコンパイルできますが、GraalではMacでもできました。バイトコードをマシンコードにするのがJITコンパイルであ…

GraalでのPHI

以前SSAそしてPHIとは何かについて学びました。 jyukutyo.hatenablog.com 今回はGraalでのPHIについて調べます。 "static single assignment"で検索すると、org.graalvm.compiler.lir.ssa.SSAUtilクラスを見つけました。 ドキュメンテーションコメントはこう…

SSA: 静的単一代入

jvm

SSAとはStatic Single Assignment Form、つまり静的単一代入のことです。 各変数が一度のみ代入されるよう定義されたものである。 静的単一代入 - Wikipedia 変数は再代入できるプログラミング言語は多いです。たとえばnというローカル変数に2回代入している…

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)を実装し…

ラムダ式からコンパイルされたメソッドの3つのパターン

Javaでのラムダ式はinvokedynamicとMethodHandleを使って呼び出されますが、ラムダ式に書いた処理はコンパイラがメソッドに変換します。 僕はあーstaticメソッドになるんだよね、と感覚的にしか理解していなかったのですが、やってみるとそうでないものもの…

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 こ…