1前書き

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


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

簡単に言えば、

JVM Code Cacheは、JVMがネイティブコードにコンパイルされたバイトコードを格納する領域です

。実行可能ネイティブコードの各ブロックを

nmethod

と呼びます。

__nmethod

__mightは、完全な、またはインライン化されたJavaメソッドです。

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


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

  • コードキャッシュは固定サイズです** 。いっぱいになると、JITコンパイラがオフになっているため、JVMは追加コードをコンパイルしません。さらに、「CodeCacheがいっぱいです…​コンパイラが無効になりました」という警告メッセージが表示されます。その結果、アプリケーションのパフォーマンスが低下します。これを避けるために、以下のサイズオプションでコードキャッシュを調整することができます。


  • InitialCodeCacheSize

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



  • ReservedCodeCacheSize

    – デフォルトの最大サイズは48MBです


  • CodeCacheExpansionSize

    – コードキャッシュの拡張サイズ、32 KB

64KB


ReservedCodeCacheSize

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

幸い、JVMにはコードキャッシュ領域

のフラッシュを制御するための


UseCodeCacheFlushing

オプションがあります。デフォルト値はfalseです。有効にすると、次の条件が満たされたときに占有領域が解放されます。

  • コードキャッシュがいっぱいです。 ** この領域はサイズがaを超えるとフラッシュされます。

特定のしきい値


最後のクリーンアップから一定の時間が経過した

  • プリコンパイルされたコードはあまり熱くありません。コンパイル済みメソッドごとに

JVMは特別なホットカウンタで追跡します。このカウンタの値が計算されたしきい値より小さい場合、JVMはこのプリコンパイル済みコードを解放します。


4コードキャッシュ使用量

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

  • コードキャッシュの使用法に関する情報を取得するには、

    – XX:+ PrintCodeCache

    JVMオプションを指定できます。アプリケーションを実行した後、同様の出力が表示されます。

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

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

出力の**

__size

__は、メモリの最大サイズを示します。


ReservedCodeCacheSize

と同じ
**

used

は現在使用中のメモリの実際のサイズです。


  • max

    used__は、使用中の最大サイズです。


  • free

    はまだ占有されていない残りのメモリです。


PrintCodeCache

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

  • いつフラッシュが起こるか見てください

  • クリティカルなメモリ使用量に達したかどうかを判断


5結論

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

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