JVM
JVMDay 15

お使いのVPSサーバに、メモリが256MBしかなければIBM J9 JVMを入れるといいと思うよ。

追記 (2018/9/18)

OpenJDK 8, 9, 10 に対応した OpenJ9 が AdoptOpenJDK や DockerHub などから入手できるようです。
対応環境は、 Linux (x64, s390x, ppc64le), Windows x64, AIX ppc64
OpenJDK 8 では、 Linux x64 Large Heap, Windows x32 もあります。

参考
Latest release | AdoptOpenJDK
https://adoptopenjdk.net/releases.html

adoptopenjdk/openjdk9-openj9 | Docker Hub
https://hub.docker.com/r/adoptopenjdk/openjdk9-openj9/

Benchmark testing demonstrates significantly better performance for both OpenJDK™ 8 and OpenJDK 9 when using Eclipse OpenJ9, than with Hotspot.
https://www.eclipse.org/openj9/oj9_performance.html

Performance Beyond Throughput: An OpenJ9 Case Study | InfoQ
https://www.slideshare.net/InfoQ/performance-beyond-throughput-an-openj9-case-study

New Open Source JVM optimized for Cloud and Microservices
https://medium.com/criciumadev/new-open-source-jvm-optimized-for-cloud-and-microservices-c75a41aa987d

追記2 (2018/9/18)

GraalVMのAOTコンパイルの雑記
https://gist.github.com/odekopoon/d5fc959b170b6b395ef98f449f01e7b8

はじめに

Linux限定の話です。Windows版は対象ユーザ又はサーバに制限があるはず。

JBoss EAPのサポートするJVMを見てみると、
https://access.redhat.com/articles/111663

OpenJDK、Oracle JDK、IBM JDK、HP JDK、Azul Zing 5 ZVM、Azul Zuluと数多くのJVMがサポートされてます。

JVMの世界ではJava Compatibility Kitという互換性に関する取り決めがありテストにパスしている条件があるため、それなりの互換性があるので、テストしながら安心して使いましょう。
http://sourceforge.jp/magazine/07/08/14/0822250

たとえば、clojureのCIでは、IBM JDK6向けにも行っています。
http://build.clojure.org/job/clojure-test-matrix/

特徴

末尾再帰最適化

IBMのJVMは、末尾再帰最適化を行います。

Javaコードの診断: Javaコードのパフォーマンスを向上させる
末尾再帰変換はアプリケーションの速度を向上させる可能性はあるが、すべてのJVMで可能な操作ではない
http://www.ibm.com/developerworks/jp/java/library/j-diag8/

メモリの利用量

スタート時のメモリ利用量が少ないようですが、実行中のメモリ利用量が多くなるようです。

デプロイコマンドや起動時にメモリを使う場合、256MBのメモリではOpenJDKやHotSpotVMだと起動できない場合にも起動できることが有ります。

Java8からHotSpotVMのメモリ構成に変化があったようですが、確認していません。
http://equj65.net/tech/java8hotspot/

さっそくダウンロード

JVMをダウンロードするのには、IBM IDが必要になります。
IBMのクラウドサービス BlueMixでも必要になるので、同時に登録してみると効率アップ。
(ちなみに登録するときにアクセス手段に電話を選ぶと、営業から電話がかかってくることがありますので、よしなに。)

x86_64なら「64-bit AMD/Opteron/EM64T」を、x86なら「32-bit x86」を選びましょう。
binファイルは実行でインストールになります。

BlueMix
http://www.ibm.com/developerworks/jp/bluemix/

CUIブラウザからダウンロードは難しかった覚えがあるので、
別PCのGUIブラウザからダウンロードして持ってきましょう。

インストール

ファイルをコピーして、実行権限を付けて、実行します。
インストールのタイミングで、ライセンスの同意が必要になります。

デフォルトでは/optフォルダ以下にインストールします。
この場合は、sudo権限で実行しましょう。

chmod u+x ./ibm-java-i386-sdk-7.1-1.1.bin
./ibm-java-i386-sdk-7.1-1.1.bin

実行

パスを変更しましょう。

export JAVA_HOME=/opt/ibm/java-i386-71
PATH=$JAVA_HOME/bin:$PATH

64bitのVMを使う場合には、32bit環境に比べると、ポインタが倍増するため圧縮するオプションが有ります。

HotSpotVMの場合は、「-XX:+UseCompressedOops」(JDK7の途中でデフォルトに)。IBM VMでは、「-Xcompressedrefs」です。
http://www.ibm.com/developerworks/jp/java/library/j-codetoheap/

ただし、メモリが256MBしかないような環境ということで、仮想サーバの場合はおそらく32bit OSでしょう。
コンテナの場合、64bitかもしれません。
(64bit環境に32bit用のライブラリを入れれば32bit版も動きます。)

バージョンを表示してみましょう。

$ java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build pxi3270_27sr1fp1-20140708_01(SR1 FP1))
IBM J9 VM (build 2.7, JRE 1.7.0 Linux x86-32 20140707_205525 (JIT enabled, AOT enabled)
J9VM - R27_Java727_SR1_20140707_1408_B205525
JIT  - tr.r13.java_20140410_61421.07
GC   - R27_Java727_SR1_20140707_1408_B205525
J9CL - 20140707_205525)
JCL - 20140707_01 based on Oracle 7u65-b16

めでたくインストール出来ました。

JDK配布元

http://www.ibm.com/developerworks/java/jdk/linux/download.html

ドキュメント

http://www.ibm.com/developerworks/java/jdk/docs.html
日本語もあります。

Azul社のJVMについて

Azul Zuluは、OpenJDKのAzul社が商用サポートを提供するバージョン。

Azul SystemsがJavaOneでZuluをリリース,Windows Azure用のOpenJDKビルド
http://www.infoq.com/jp/news/2013/10/azul-zulu

Azul Zing 5 ZVMは、PauselessGCをうたうエンタープライズ向けの低遅延アプリケーション向けのVMです。

LMAXがAzulのZing JVMを使ってレイテンシを50%改善
http://www.infoq.com/jp/news/2013/05/lmax-zing

The Azul Garbage Collector
http://www.narihiro.info/translate/the-azul-garbage-collector-ja.html

IBM JVM導入ということで、今回は触れません。