web-dev-qa-db-ja.com

ReservedCodeCacheSizeおよびInitialCodeCacheSizeとは何ですか?

誰かがJVMオプションReservedCodeCacheSizeInitialCodeCacheSizeが何であるか説明してもらえますか?具体的にいつ/なぜ変更したいのですか?適切なサイズをどのように決定しますか?

これはドキュメントが言うことです:

-XX:ReservedCodeCacheSize = 32m予約済みコードキャッシュサイズ(バイト単位)-最大コードキャッシュサイズ。 [Solaris 64ビット、AMD64、および-server x86:2048m。 1.5.0_06以前では、Solaris 64ビットおよびand64:1024m。]

80
Raghu

ReservedCodeCacheSize(およびInitialCodeCacheSize)は、Java Hotspot VM。)の(ジャストインタイム)コンパイラーのオプションです。基本的には、コンパイラのコードキャッシュ。

キャッシュがいっぱいになると、次のような警告が表示されます。

_Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled.
Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize=
Code Cache  [0x000000010958f000, 0x000000010c52f000, 0x000000010c58f000)
 total_blobs=15406 nmethods=14989 adapters=362 free_code_cache=835Kb largest_free_block=449792
_

Java HotSpot(TM) Client VM warning: Exception Java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminatedが続くと、さらに悪化します。

このオプションをいつ設定しますか?

  1. hotspotコンパイラーに障害が発生した場合
  2. jVMが必要とするメモリを削減します(したがって、JITコンパイラーの障害のリスクがあります)

通常、この値は変更しません。この問題はごくまれにしか発生しないので(デフォルトでは)、デフォルト値は非常にバランスが取れていると思います(私の経験では)。

69
jeha

@jehaは、パラメーターに設定する値を除き、この質問から知りたいことすべてに答えます。展開するコードを記述しなかったため、メモリフットプリントをあまり把握できませんでした。

ただし、jconsoleを使用して実行中のJavaプロセスにアタッチし、[メモリ]タブを使用してコードキャッシュサイズを確認できます。完全を期すために、手順は(Linux VM環境。ただし、他の環境も同様であると確信しています):

  1. マシンでjconsoleを起動します
  2. 適切なプロセスIDを見つけてjconsoleを添付します(これには少し時間がかかります)
  3. 「メモリ」タブに移動します
  4. 「チャート:」ドロップダウンリストから、「メモリプール「コードキャッシュ」」を選択します
  5. 繰り返しますが、画面が更新されるまでに少し時間がかかる場合があり、次のように表示されます。 jconsole code cache image

    ご覧のとおり、私のコードキャッシュは約49 MBを使用しています。この時点で、ドキュメント(および@jeha)が48 MBと言っているデフォルトのままでした。確かに、私が設定を増やす大きなモチベーションです!

    ベン。


    デフォルトでは1024 MBが多すぎるかもしれませんが、デフォルトでは48 MBが多すぎるようです...

12
Animal451

Indeedエンジニアリングチームの優れた学習経験と、jdk 8への移行時に直面した課題。

http://engineering.indeedblog.com/blog/2016/09/job-search-web-app-Java-8-migration/

結論:Jdk 8はJDK 7より多くのコードキャッシュを必要とします

JRE 8のデフォルトのコードキャッシュサイズは約250MBで、JRE 7のデフォルトの48MBの約5倍です。私たちの経験では、JRE 8には追加のコードキャッシュが必要です。これまでに約10個のサービスをJRE 8に切り替えましたが、すべてのサービスが以前よりも約4倍のコードキャッシュを使用しています。

2
vsingh

from https://blogs.Oracle.com/poonam/entry/why_do_i_get_message

以下は、CodeCacheフラッシュに関するjdk7u4 +の2つの既知の問題です。

  1. 緊急フラッシュ後、CodeCacheの占有率がほぼ半分に低下した後でも、コンパイラが再起動しない場合があります。
  2. 緊急フラッシュは、コンパイラスレッドによるCPU使用率が高くなり、全体的なパフォーマンスが低下する可能性があります。

このパフォーマンスの問題、およびコンパイラが再び有効にならないという問題は、JDK8で対処されています。 JDK7u4 +でこれらの問題を回避するには、ReservedCodeCacheSizeオプションを使用してコードキャッシュサイズを大きくし、コンパイル済みコードのフットプリントよりも大きい値に設定して、CodeCacheがいっぱいにならないようにします。これに対する別の解決策は、-XX:-UseCodeCacheFlushing JVMオプションを使用してCodeCacheフラッシュを無効にすることです。

上記の問題はJDK8とそのアップデートで修正されました。

そのため、JDK 6(コードフラッシュが無効になっている)および7で実行されているシステムについては、言及する価値があるかもしれません。

0