誰かがJVMオプションReservedCodeCacheSize
とInitialCodeCacheSize
が何であるか説明してもらえますか?具体的にいつ/なぜ変更したいのですか?適切なサイズをどのように決定しますか?
これはドキュメントが言うことです:
-XX:ReservedCodeCacheSize = 32m予約済みコードキャッシュサイズ(バイト単位)-最大コードキャッシュサイズ。 [Solaris 64ビット、AMD64、および-server x86:2048m。 1.5.0_06以前では、Solaris 64ビットおよびand64:1024m。]
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
が続くと、さらに悪化します。
このオプションをいつ設定しますか?
通常、この値は変更しません。この問題はごくまれにしか発生しないので(デフォルトでは)、デフォルト値は非常にバランスが取れていると思います(私の経験では)。
@jehaは、パラメーターに設定する値を除き、この質問から知りたいことすべてに答えます。展開するコードを記述しなかったため、メモリフットプリントをあまり把握できませんでした。
ただし、jconsoleを使用して実行中のJavaプロセスにアタッチし、[メモリ]タブを使用してコードキャッシュサイズを確認できます。完全を期すために、手順は(Linux VM環境。ただし、他の環境も同様であると確信しています):
繰り返しますが、画面が更新されるまでに少し時間がかかる場合があり、次のように表示されます。
ご覧のとおり、私のコードキャッシュは約49 MBを使用しています。この時点で、ドキュメント(および@jeha)が48 MBと言っているデフォルトのままでした。確かに、私が設定を増やす大きなモチベーションです!
ベン。
デフォルトでは1024 MBが多すぎるかもしれませんが、デフォルトでは48 MBが多すぎるようです...
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倍のコードキャッシュを使用しています。
from https://blogs.Oracle.com/poonam/entry/why_do_i_get_message :
以下は、CodeCacheフラッシュに関するjdk7u4 +の2つの既知の問題です。
- 緊急フラッシュ後、CodeCacheの占有率がほぼ半分に低下した後でも、コンパイラが再起動しない場合があります。
- 緊急フラッシュは、コンパイラスレッドによるCPU使用率が高くなり、全体的なパフォーマンスが低下する可能性があります。
このパフォーマンスの問題、およびコンパイラが再び有効にならないという問題は、JDK8で対処されています。 JDK7u4 +でこれらの問題を回避するには、ReservedCodeCacheSizeオプションを使用してコードキャッシュサイズを大きくし、コンパイル済みコードのフットプリントよりも大きい値に設定して、CodeCacheがいっぱいにならないようにします。これに対する別の解決策は、-XX:-UseCodeCacheFlushing JVMオプションを使用してCodeCacheフラッシュを無効にすることです。
上記の問題はJDK8とそのアップデートで修正されました。
そのため、JDK 6(コードフラッシュが無効になっている)および7で実行されているシステムについては、言及する価値があるかもしれません。