コンテンツにスキップ

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.png

(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) が軽量なのでおすすめ。