JVMコードキャッシュの紹介

JVMコードキャッシュの概要

1. 前書き

このチュートリアルでは、JVMのコードキャッシュメモリを簡単に見て学習します。

2. コードキャッシュとは何ですか?

簡単に言えば、JVM Code Cache is an area where JVM stores its bytecode compiled into native codeです。 実行可能ネイティブコードの各ブロックをnmethodと呼びます。 nmethod は、完全なJavaメソッドまたはインライン化されたJavaメソッドである可能性があります。

ジャストインタイム(JIT)コンパイラは、コードキャッシュ領域の最大の消費者です。 そのため、一部の開発者はこのメモリをJITコードキャッシュと呼んでいます。

3. コードキャッシュの調整

The code cache has a fixed size。 いっぱいになると、JITコンパイラがオフになるため、JVMは追加のコードをコンパイルしません。 さらに、“CodeCache is full… The compiler has been disabled」警告メッセージが表示されます。 その結果、アプリケーションのパフォーマンスが低下することになります。 これを回避するために、次のサイズオプションを使用してコードキャッシュを調整できます。

  • InitialCodeCacheSize –初期コードキャッシュサイズ、デフォルトは160K

  • ReservedCodeCacheSize –デフォルトの最大サイズは48 MB

  • CodeCacheExpansionSize –コードキャッシュの拡張サイズ、32KBまたは64KB

ReservedCodeCacheSizeを増やすことは解決策になる可能性がありますが、これは通常、一時的な回避策にすぎません。

幸い、JVMはUseCodeCacheFlushing option to control the flushing of the code cache areaを提供します。 デフォルト値はfalseです。 有効にすると、frees the occupied area when the following conditions are met:

  • コードキャッシュがいっぱいです。 this area is flushed if its size exceeds a certain threshold

  • 最後のクリーンアップ以降、特定の間隔が経過しました

  • プリコンパイルされたコードは十分に熱くありません。 コンパイルされたメソッドごとに、JVMは特別なホットカウンターで追跡します。 このカウンタの値が計算されたしきい値よりも小さい場合、JVMはこのプリコンパイルされたコードを解放します

4. コードキャッシュの使用法

コードキャッシュの使用量を監視するには、現在使用中のメモリのサイズを追跡する必要があります。

To get information on code cache usage, we can specify the –XX:+PrintCodeCache JVM option。 アプリケーションを実行すると、同様の出力が表示されます。

CodeCache: size=32768Kb used=542Kb max_used=542Kb free=32226Kb

これらの各値の意味を見てみましょう。

  • 出力のsize は、メモリの最大サイズを示します。これは、ReservedCodeCacheSizeと同じです。

  • usedは、現在使用されているメモリの実際のサイズです。

  • max_usedは、使用されている最大サイズです

  • freeは、まだ使用されていない残りのメモリです

PrintCodeCacheオプションは、次のように非常に便利です。

  • フラッシングがいつ起こるかを見る

  • 重要なメモリ使用量ポイントに到達したかどうかを判断する

5. 結論

この簡単な記事では、JVMコードキャッシュの簡単な紹介を行います。

さらに、このメモリ領域を監視および診断するための使用および調整オプションをいくつか提示しました。