Fight the Future

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

jvm

新着順 人気順

クラスファイルはすべからくjavapしよう

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } javac HelloWorld.javaしてクラスファイルを生成します。さっそくjavap HelloWorldしましょう。javapコマンドはOpenJDK系(OpenJDKやHotSpot、…

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…

Graalのグラフ

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

JVM(HotSpot VM)におけるIntrinsics(C2/Graal)

Project Loomのソースを読んでいると、また遭遇しました。 public class Continuation { ... @HotSpotIntrinsicCandidate private static int doYield(int scopes) { throw new Error("Intrinsic not installed"); }; ... } @HotSpotIntrinsicCandidateアノ…

Graalが使うJVMCIとは

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

SSA: 静的単一代入

jvm

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

JMHの`-prof perfasm`がめちゃすごい

JMH(Java Microbenchmark Harness)で、-prof perfasmをすると、perfと-XX:+PrintAssemblyを使って、JITコンパイラ生成コードでのホットな部分を表示してくれるという機能があります。これが、思いの外すごい機能だったので、紹介します。 前提条件 JMHを知…

JavaOne 2017 2日目 #JavaOne #j1jp

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

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

jvm

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

Java 11 / JEP 181のNestmatesでのバイトコードの変更を見比べる

JEP 181: Nest-Based Access Controlというものがあります。これはNestmates(ネストメイト)と呼ばれるものです。 http://openjdk.java.net/jeps/181 Nestmatesは、クラスやインタフェースをネストして作成したとき、ネストする側される側の両方を指す言葉…

JavaプロセスがダンプしたコアファイルをjhsdbとGDBで見る

jvm

手持ちのコアファイルがない場合は、yasuenagさんのリポジトリからすぐに作れます!! https://github.com/YaSuenag/garakuta/tree/master/NativeSEGV Linuxではあらかじめulimit -c unlimitedしてから実行してください。 デバッグ情報付きのOpenJDKビルドを…

JITWatchでJITコンパイルを見よう!

この記事は JVM Advent Calendar 4日目 の記事です。 JVM Advent Calendar 2014 - Qiita JITWatchについて JVMなみなさんは、JITコンパイルをご存知だと思います。 JITWatchは、アプリケーションにおけるJITコンパイルについて、可視化し分析するためのツー…

オレオレ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…

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

jvm

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

日本中がGraalに湧いた日

Java Day Tokyo 2018で、"Graal: How to use the new JVM JIT compiler in real life"というセッションがありました。スピーカはTwitter社のChris Thalingerさんです。 www.oracle.co.jp Chrisさんは今年Voxxed DaysやOracle Codeなどさまざまなカンファレン…

HotSpot VMビルド時のADファイル処理

jvm

以前HotSpot VMのIntrinsicsを見ました。ビルド時にAD(Architecture Description)ファイルから各CPUアーキテクチャに合わせたC++のソースファイルを生成しています。 www.sakatakoichi.com しかし、ADファイルからどのようにC++のソースを生成しているのか…

OpenJDKをZeroを有効にしてビルドする

Zeroはインタプリタのみにするものです。macOS 14.3.1でビルドしました。 $ sh ./configure --with-jvm-variants=zero --enable-debug $ make images $ ~/jdk/build/macosx-aarch64-zero-fastdebug/jdk/bin/java -version openjdk version "23-internal" 202…

perfコマンド実行時におけるJavaのシンボルマップファイル生成方法

JDK 16以降は以下でOKです。 jcmd <PID> Compiler.perfmap perf用ですのでこのコマンドはLinuxのみです。 これはAdd diagnostic command to write Linux perf map file で入りました。 JDK 8や11などのJDK 15以前だとjcmdにこのコマンドがありません。別途perf-ma</pid>…

OpenJDKのgtestを実行する

openjdk.java.net OpenJDKにはjtregのテストとgtest(GoogleTest)のテストがあるのですが、gtestの方です。ドキュメントにあるmake test-only TEST=の形式ですぐに動かせなかったので、同僚に教えてもらった他の実行方法をメモとして残します。 セットアッ…

jhsdbでバージョンチェックを無効にする

jvm

このブログで以下のエントリを投稿していました。 www.sakatakoichi.com この中で、 サーバーで指定したJDKのバージョンと、WindowsでGUIを起動したJDKのバージョンが異なると、上記の警告が出ます。 という、リモート・デバッグ・サーバーとクライアントの…

HotSpot VMのシンボル名に関わるコード

師匠から教えていただいた内容であり、私自身がいきなり気づいたわけではないのですが、OpenJDKのメーリングリストでも他の方からも教えていただいたので、自分の備忘録的にまとめます。 Javaのシンボル名に関するHotSpot VMのコードの話です。ここでのシン…

JVM Language Summit 2019 参加記 #jvmls_jp

2019/07/29-31に、JVM Language Summit(通称JVMLS)に参加しました。 期間中、メモのようなブログエントリを残しています。 www.sakatakoichi.com www.sakatakoichi.com www.sakatakoichi.com 今回、私にしては珍しく、カメラを持参して撮影したので、写真…

JVM Language Summit 2019に参加しました: 3日目:最終日 #jvmls_jp

JVM Language Summit (JVMLS) 2019の3日目、最終日が終わりました。 1日目はこちら。 www.sakatakoichi.com 2日目はこちら。 www.sakatakoichi.com 3日目は、半日しかなく、しかもJava系のセッションはNullnessのものだけでした(要するに、どのセッションも…

JVM Language Summit 2019に参加しました: 2日目 #jvmls_jp

JVM Language Summit (JVMLS) 2019の2日目が終わりました。 JVMLSとは、1日目に関しては、こちらのエントリにあります。 www.sakatakoichi.com 2日目は、JITコンパイルとAOTコンパイル、GraalVM関連と、私にとって最高の日でした。 最初のセッションは、Open…

JVM Language Summit 2019に参加しました: 1日目 #jvmls_jp

2019/07/29-31に、オラクルのUSサンタクララオフィス(本社ではないところ)で開催されている、JVM Language Summit(通称JVMLS)に参加しています。 http://openjdk.java.net/projects/mlvm/jvmlangsummit/ 私は昨年2018年に初参加して、今回が2回目です。 …

ガベージコレクタとJVMCI

jvm

ZGCのセッションで、今後の長期目標の1つとして、JVMCIに対応する、と聞きました。逆に考えると、GCの中には、JVMCIに対応していないものがある、と理解しました。 現時点で新しめのOpenJDK(53918:616a32d6b463)で、試します。 デフォルト(G1GC) $ build…

作って学ぶガベージコレクタをやってみた

jvm

2019年2月のFOSDEMというイベントが、ベルギーのブリュッセルでありました。 FOSDEMは、Free and Open Source Developer's European Meetupの頭文字です。 そこで、「Build your own GC with OpenJDK in 20 minutes」というセッションがありました。 録画も…

JJUGナイトセミナー「JVM言語を作ろう! GraalVMで遊ぼう!」で登壇しました #jjug

2019/02/27に、JJUG(日本Javaユーザグループ)さんでのナイトセミナー、「JVM言語を作ろう! GraalVMで遊ぼう!」で登壇をしました。 www.java-users.jp 「GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう」というセッションです。スライド…

macOSでのjtregセットアップ

OpenJDKのテストは、jtregなので、セットアップしました。 http://openjdk.java.net/projects/code-tools/jtreg/intro.html macOSでビルドします。 http://openjdk.java.net/jtreg/build.html $ sh make/build-all.sh /Library/Java/JavaVirtualMachines/jdk…

static finalな定数が速いのは、何がどうなって速い?

定数を利用した最適化、というのはイメージしやすいですし、実際速くなります。今回、Alekseyさんのサンプルを使いながら、まずはstatic finalな値のコンパイルコードを実際に見て、どう速いのか学びました。 JVM Anatomy Park #15: Just-In-Time Constants …