Java¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. Javaとは¶
記入中...
02. JVM:Java Virtual Machine¶
JVM言語 (例:Java、Scala、Kotlinなど) のコードを、Javaバイトコードを含むクラスファイルに変換する。
03. Javaのコンパイルの仕組み¶

Javaでは、コードの実行前と実行中の二段階で機械語を翻訳する。
(1)-
Javaコンパイラ (javac) は、JVM言語のコード (
.javaファイル) を、Javaバイトコードを含むクラスファイル (.classファイル) に変換する。 (2)-
アプリケーションの実行前に、JVM内のJavaインタプリタはクラスファイルを機械語に翻訳する。
(3)-
アプリケーションの実行中に、JVM内のクラスローダーはクラスファイルをJVM内に取得する。
クラスローダーの処理はCPUを大量に消費するため、ユーザーへの公開前にウォームアップを実施すると良い。

(4)-
アプリケーションの実行中に、JVM内のJITコンパイラは実行中関数のみを機械語に翻訳する。
また、繰り返し実行される関数の翻訳を最適化する (例:不要な処理を省く) 。
JITコンパイラの処理はCPUを大量に消費するため、ユーザーへの公開前にウォームアップを実施すると良い。
(5)-
結果的に、OS (制御プログラム?) に依存せずに、命令を実行できる (C言語) 。
CPU消費¶
▼ ウォームアップとは¶
JVM言語 (例:Java、Scala、Kotlinなど) 製のアプリケーションは、最初の実行時に以下の理由でCPUを大量に消費するために、パフォーマンスが低い。
- JVM内のクラスローダーはクラスファイル (
.classファイル) をJVM内に取得する。 - JVM内のJITコンパイラは実行中関数のみを機械語に翻訳する。
アプリケーションをユーザーに公開する前に、本番環境と同じデータを使ってアプリケーションを実行して上記を済ませておくとよい (ウォームアップ) 。
これにより、パフォーマンスが高い状態でユーザーにアプリケーションを公開できる。
ウォームアップを済ませたつもりでいて、実は完全に済んでいない場合に備えて、スロースタートな負荷分散も採用すると良い。

- https://stackoverflow.com/a/1481903/12771072
- https://www.baeldung.com/java-jvm-warmup
- https://eng-entrance.com/java-jlt
- https://levelup.gitconnected.com/a-deep-dive-into-classloader-reflection-dynamic-typing-and-runtime-modifiable-classes-in-java-c83d6d689b2
- https://speakerdeck.com/kazu_kichi_67/java-x-spring-bootzhi-apurikesiyonnokorudosutatonili-tixiang-kau?slide=14
▼ ウォームアップの実装¶
フレームワーク (例:SpringBoot) によっては、Readinessエンドポイント (例:/actuator/health/readiness) を公開している。
ユーザーへの公開前に、このエンドポイントにリクエストを送信しておく。
▼ Kubernetes環境の場合¶
ReadinessProbeヘルスチェックでウォームアップを実施する。
メモリ消費¶
JavaのJVMではOOMキラーが起こることがある。
JVMは以下でメモリを消費するため、これら全てを合計したメモリサイズ以上を割り当てる必要がある。
- ヒープサイズ
- ロードされたメタデータ
- Code Cache
- UseCodeCacheFlushing
- ReservedCodeCacheSize
- Thread
- GC
04. コンテナ化¶
コンテナイメージの軽量化¶
コンテナイメージは、LTS (headless) が軽量なのでおすすめ。