2016-07-03 11 views
0

私は、ReservedCodeCacheSize = 128MとUseCodeCacheFlushingを有効にして、Oracle Java 8 JVM(サーバーではなく、クライアントでも組み込みでもない)を実行しています。数日後、コーデックキャッシュは93%から80%に急速に落ちました。私はコーデックキャッシュのフラッシュを目撃したと仮定していると仮定しますが、フラッシュ後のサイズが50%フル以上の100%に近いことは驚くべきことでした。Oracle JVM 8:コードキャッシュのフラッシュが有効な場合、フラッシュされる量はいくらですか?

JVMは、どのくらいの量のCodecacheをフラッシュするかを決定します。

This Oracle Java 8 pageは、オプションが記載されているが、フラッシュCodecacheを定量化しません:

は、コンパイラをシャットダウンする前に、コードキャッシュのフラッシュを有効にします。このオプションは、デフォルトで有効になっています。コンパイラをシャットダウンする前にコードキャッシュのフラッシュを無効にするには、-XX:-UseCodeCacheFlushingを指定します。

This Oracle blog postはCodecacheのフラッシュを制御するために使用することができますJVMオプションUseCodeCacheFlushingがあり、

を言います。このオプションを有効にすると、JVMは、がコンパイル済みコード(旧式)の古い半分を破棄してCodeCacheでスペースを使用できるようにする、緊急フラッシュを呼び出します。

コンパイルされたコードの半分がコーデック全体の20%にすぎないと考えられますが、上記のブログ投稿は不正確です。

答えて

4

'古いもの'は、文字通りすべての方法の50%を意味しません。コンパイルされたコードをスイープするHotSpotロジックはちょっと複雑です。最も良い説明はsource codeですが、私は以下に簡単な概要を示します。以下の条件のうちの少なくとも1つが満たされた場合

スイーパーが起動されます

  1. コードのキャッシュがいっぱいになっています。
  2. 最後のスイープ以降、十分な状態変化があります(JDK 8は、と十分に「」と、ReservedCodeCacheSizeの1%以上を測定します)。
  3. 最後の掃引から一定の時間が経過しています。コードキャッシュで使用可能なスペースが多いほど、スイーパが呼び出される頻度は少なくなります。正確な公式はhereです。スイーパーを実行すると

は、それは常にすべてのゾンビ nmethods、何のアクティベーションを持っていない、すなわち無負荷、最適化を解除または再コンパイル方法を解放します。また

UseCodeCacheFlushingが有効になっている場合、それは寒い十分です生き nmethodsを解放します。それぞれで

  • 辛カウンタデフォルト値にリセットされたアクティブなスタックフレームを有するnmethodsのをセーフポイント次のように冷たい方法が決定されます。デフォルトのホットネス値は2 * (ReservedCodeCacheSize/1MB)です。
  • スイーパーが実行されるたびに、アライブメソッドのホットカウンターを1ずつ減らします。
  • ホットメーターが計算されたしきい値より小さくなると、メソッドが解放されます。しきい値は、コードキャッシュのフリーレシオと-XX:NmethodSweepActivityオプション(デフォルトでは10)に依存します。大きいほうがNmethodSweepActivityであり、コードキャッシュの空き率が小さいほど、コンパイルされたメソッドが掃引されます。 Hereは数式です。

したがって、掃引されるコンパイルされたメソッドの数は正確ではありません。これは、予約されたコードキャッシュのサイズ、空きスペースの量、ゾンビのメソッドの数、コールドメソッドの数、およびNmethodSweepActivityのようなJIT人間工学のオプションに応じて、実行時に計算されます。

+0

OpenJDKのソースを参照しました。 Oracle JVMが同じアルゴリズムを使用していると思いますか? – user100464

+1

@ user100464はい、OpenJDKとOracle JDKはOpenJDKバージョンのJVMに特定の商用機能がないことを除いて、同じHotSpot JVMを実行します。 – apangin

関連する問題