コンテンツにスキップ

Java

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Javaとは

記入中...

02. JVM:Java Virtual Machine

JVM 言語 (例:Java、Scala、Kotlin など) のコードを、Java バイトコードを含むクラスファイルに変換する。


03. Javaのコンパイルの仕組み

java_compile

Java では、コードの実行前と実行中の二段階で機械語を翻訳する。

(1)

Java コンパイラ (javac) は、JVM 言語のコード (.java ファイル) を、Java バイトコードを含むクラスファイル (.class ファイル) に変換する。

(2)

アプリケーションの実行前に、JVM 内の Java インタプリタはクラスファイルを機械語に翻訳する。

(3)

アプリケーションの実行中に、JVM 内のクラスローダーはクラスファイルを JVM 内に取得する。

クラスローダーの処理はCPUを大量に消費するため、ユーザーへの公開前にウォームアップを実施すると良い。

java_class-loader

(4)

アプリケーションの実行中に、JVM 内の JIT コンパイラは実行中関数のみを機械語に翻訳する。

また、繰り返し実行される関数の翻訳を最適化する (例:不要な処理を省く) 。

JITコンパイラの処理はCPUを大量に消費するため、ユーザーへの公開前にウォームアップを実施すると良い。

(5)

結果的に、OS (制御プログラム?) へ依存せず、命令できる (C 言語) 。


CPU消費

▼ ウォームアップとは

JVM 言語 (例:Java、Scala、Kotlin など) 製のアプリケーションは、最初の実行時に以下の理由で CPU を大量に消費するために、パフォーマンスが低くなる。

  • JVM 内のクラスローダーはクラスファイル (.class ファイル) を JVM 内に取得する。
  • JVM 内の JIT コンパイラは実行中関数のみを機械語に翻訳する。

アプリケーションをユーザーに公開する前は、本番環境と同じデータを使ってアプリケーションを実行して上記を済ませておくとよい (ウォームアップ) 。

これにより、パフォーマンスが高い状態でユーザーにアプリケーションを公開できる。

ウォームアップを済ませたつもりでいて、実は完全に済んでいない場合に備えて、スロースタートな負荷分散も採用するとよい。

java_compile

▼ ウォームアップの実装

フレームワーク (例:SpringBoot) によっては、Readiness エンドポイント (例:/actuator/health/readiness) を公開している。

ユーザーへの公開前に、このエンドポイントにリクエストを送信しておく。

▼ Kubernetes環境の場合

ReadinessProbe ヘルスチェックでウォームアップを実施する。


メモリ消費

Java の JVM では、OOM キラーが起こる場合もある。

JVM は以下でメモリを消費するため、これらすべてを合計したメモリサイズ以上を割り当てる必要がある。

  • ヒープサイズ
  • ロードされたメタデータ
  • Code Cache
  • UseCodeCacheFlushing
  • ReservedCodeCacheSize
  • Thread
  • GC


04. コンテナ化

コンテナイメージの軽量化

コンテナイメージは、LTS (headless) が軽量なのでおすすめ。