Java仮想マシン(JVM:Java Virtual Machine)の起動は速くなっているらしいけど

nazology.net

⇧ amazing...

Java仮想マシンJVMJava Virtual Machine)とは

Wikipediaさんによりますと、

Java virtual machine (JVM) is a virtual machine that enables a computer to run Java programs as well as programs written in other languages that are also compiled to Java bytecode.

https://en.wikipedia.org/wiki/Java_virtual_machine

Overview of a Java virtual machine (JVM) architecture based on The Java Virtual Machine Specification Java SE 7 Edition

https://en.wikipedia.org/wiki/Java_virtual_machine

⇧ という説明なのですが、Java仮想マシンJVMJava Virtual Machine)自体は、

JavaプラットフォームにおけるJava EE(現・Jakarta EE)の位置づけ。Java EEJava SE拡張機能として位置づけられた。

https://ja.wikipedia.org/wiki/Jakarta_EE

JREJava Runtime Environment)に含まれますと。

ちょっと、Wikipediaの情報とは異なってそうなんだけど、

medium.com

⇧ ベン図としては、

 JDK \supset JRE \supset JVM

って感じになるらしい。

JREJava Runtime Environment)の説明を見ると、

JREは、Javaアプリケーション開発に必要なJavaコンパイラなどを含むソフトウェア開発キット (SDK) であるJava Development KitJDKJava開発キット)にも同梱されている。

https://ja.wikipedia.org/wiki/Java_Runtime_Environment

JDKJava Development Kit)にJREJava Runtime Environment)が同梱されるとあるので、Jakarta EEの説明図が間違ってるんかな?

Java仮想マシンJVMJava Virtual Machine)には種類があるらしく、

This article provides non-exhaustive lists of Java SE Java virtual machines (JVMs).

https://en.wikipedia.org/wiki/List_of_Java_virtual_machines

Active

https://en.wikipedia.org/wiki/List_of_Java_virtual_machines

⇧ 開発が続いているものが、上記になるんかな。

Javaの性能とJava仮想マシンJVMJava Virtual Machine)の関係

Javaの性能の説明を見ると、

プログラミング言語Javaは、その「ネットワークから送り込まれるプログラムの安全な実行」や「write once, run anywhere」というスローガンを、業界にありがちなスローガンだけのスローガンではなく可能な限り達成するべく、Javaバイトコードコンパイルするコンパイラと、Javaバイトコードを解釈実行するインタプリタであるJava仮想マシン (Java VM, JVM)、という構成の実装を、公式の実装として伴って発表された。

Javaの性能 - Wikipedia

コンピュータ科学的には特に目新しいものではない。しかし、従来のC言語あるいはC++といったネイティブコードコンパイルする言語で書かれたアプリケーションソフトウェアとの性能比較や、当初はJVMのチューニングや高速化手法が進んでいなかったことによる性能の制限、また、当時の一般ユーザーが使っていたMicrosoft Internet Explorerにおいて、Javaアプレットが埋込まれたウェブページを表示しようとすると、 JVMを起動するために数十秒から最悪の場合は数分も待たされたことから(起動してしまえば実は高性能なVMだったのだが)、「Javaは遅い」などと言われるようになったため、「Javaの性能」が議論されるようになった。

Javaの性能 - Wikipedia

Java仮想マシンJVMJava Virtual Machine)の初回起動に数十秒かかっていたというから、驚き。

Javaプログラムの実行速度はJITコンパイルの導入(1997年 / 1998年のJava 1.1以降)や 、 コードの解析の機能が言語に追加されたこと、Java仮想マシン自体の最適化(2000年からサン・マイクロシステムズVMで標準的に動作するようになったHotSpot技術など)によって大きく向上した。

Javaの性能 - Wikipedia

⇧ 改善はされているらしい。

改善はされてるとは言え、推測するに、

起動時間

Javaアプリケーションの起動時は、膨大な数のクラス(プラットフォームのクラスライブラリ全てのクラスを含む)を使用前にロードしなければならないため、CC++よりもかなり時間がかかることが多い。

Javaの性能 - Wikipedia

起動時間の大半はJVMの初期化やクラスのロードそのものではなく、I/Oを伴う操作によるものと思われる (rt.jarのクラスデータファイルは40MBあり、JVMは多数のデータをこの巨大なファイルをシークして取り出さなければならない)

Javaの性能 - Wikipedia

Javaの性能にJava仮想マシンJVMJava Virtual Machine)が影響してることは間違いなさそう。

Java仮想マシンJVMJava Virtual Machine)の起動は速くなっているらしいけど

Javaの実行速度に影響すると言われてるのが、Java仮想マシンJVMJava Virtual Machine)の起動時間らしいのですが、

zenn.dev

nowokay.hatenablog.com

⇧ 上記サイト様によりますと、Hotspotが一番速いということのようです。

Java仮想マシンJVMJava Virtual Machine)の種類によって、起動の速さが変わってくるみたいですね。

docs.oracle.com

JRockit JVMは、長時間実行されるアプリケーション用に設計されているJITコンパイルJVMです。このJVMは、メソッドが初めてコールされたときにそのメソッドをマシン・コードにコンパイルします。したがって、多数の新規メソッドがコンパイルされるためにアプリケーションの起動は比較的に遅くなります。ただし、起動した後は、アプリケーションの実行速度は速くなります。さらに、アプリケーションの実行にしたがって、JVMは頻繁にコールされるメソッドを最適化して、パフォーマンスをさらに向上させます。

JVMの起動が遅い

JRockitというJava仮想マシンJVMJava Virtual Machine)は起動に時間がかかると正直に記載してますね。

Javaが、Java仮想マシンJVMJava Virtual Machine)で動く以上、初回起動に時間がかかってしまうのは致し方ないということですかね。

つまり、AWS Lambdaのようなサーバーレスを実施するには、Javaは向いていないってことかと。

cero-t.hatenadiary.jp

⇧ 上記サイト様でも、外部ライブラリを使った場合は、パフォーマンスが落ちそうなことを仰っておられたので。

サーバーレスになると、

zenn.dev

native-imageは高速なJava及びその他言語のVMであるGraalVMの目玉機能の一つであるJavaAOT (Ahead-Of-Time) での ネイティブイメージへの変換です。

Javaがサーバレスに至るまでの道のり

Java中間言語JVMインタプリタ的に実行しJIT(Just in Time) コンパイラで最適化して高速に実行することは良く知られています。一方で、その反面起動時間がGoやCに比べて遅い事も。native-imageはJavax86/Linux等の実行ファイルAOTコンパイル、つまりCやGoのように普通に機械語にそのタイミングで変換する方式です。そのため非常に高速に起動メモリ使用量も小さい、という特徴を持ちます。一方でほとんどの処理がピーク性能ではJITで最適化したJVMにはかないません。しかし、これは毎回起動しJITの効果薄いサーバレスには最適の方法です。

Javaがサーバレスに至るまでの道のり

⇧ HotspotよりもGraalVMの方が起動時間が早いという人もおられますね、正確にはGraalVMの一機能である、AOT(Ahead Of Time)で変換されるnative-imageが高速ってことみたいです。

AOT(Ahead Of Time)とJIT(Just In Time)の違いについては、

thevaluable.dev

⇧ 上図が分かりやすいかと。

AWS Lambdaの言語毎の性能比較を見た限り、

aws.amazon.com

Java仮想マシンJVMJava Virtual Machine)でサーバーレスを実現する場合は、GraalVMの機能であるnative-imageを使うのが良さそうでしょうか。

毎度モヤモヤ感が半端ない...

今回はこのへんで。