Что такое ReservedCodeCacheSize и InitialCodeCacheSize?

86

Может кто - то пожалуйста , объясните , какой вариант JVM ReservedCodeCacheSizeи InitialCodeCacheSizeесть? В частности, когда и зачем мне его менять? Как мне выбрать правильный размер?

Вот что говорят документы:

-XX: ReservedCodeCacheSize = 32m Зарезервированный размер кэша кода (в байтах) - максимальный размер кэша кода. [Solaris 64-бит, amd64 и -сервер x86: 2048m; в 1.5.0_06 и более ранних версиях Solaris 64-bit и and64: 1024m.]

Рагху
источник
2
ОП этого сообщения написал:> -XX: ReservedCodeCacheSize = 32m Зарезервированный размер кеша кода (в байтах) - максимальный размер кеша кода. [64-разрядная версия Solaris, amd64 и -сервер x86: 48m; в 1.5.0_06 и ранее, Solaris 64-бит и and64: 1024 м.] Я просто хочу исправить, что упомянутая верхняя граница в 48 м должна быть опечаткой. Это 2048 м.
Лассе Агрен 09

Ответы:

73

ReservedCodeCacheSizeInitialCodeCacheSize) - это опция для (своевременного) компилятора виртуальной машины Java Hotspot. По сути, он устанавливает максимальный размер кеша кода компилятора.

Кеш может переполниться, что приводит к следующим предупреждениям:

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)

Обычно вы не меняете это значение. Я думаю, что значения по умолчанию довольно хорошо сбалансированы, потому что эти проблемы возникают только в очень редких случаях (по моему опыту).

Jeha
источник
1
Ницца. Каковы значения по умолчанию и до каких они должны быть увеличены, если мы видим, что «CodeCache заполнен». предупреждение?
axel22
3
@ axel22: значения фактически зависят от платформы и версии JVM; значения из документа для Sun JVM: Reserved code cache size (in bytes) - maximum code cache size. [Solaris 64-bit, amd64, and -server x86: 48m; in 1.5.0_06 and earlier, Solaris 64-bit and amd64: 1024m.]не знаю значений OpenJDK. Умеренного увеличения должно быть достаточно (ранее установка 1024м была выше добра и зла).
jeha
12

@jeha отвечает на все, что я хотел узнать из этого вопроса, кроме того, какое значение установить для параметров. Поскольку я не писал код, который развертывал, у меня не было особого представления о том, какой объем памяти он имел.

Однако вы можете использовать jconsole для подключения к запущенному процессу Java, а затем использовать вкладку «Память», чтобы узнать размер кэша кода. Для полноты, шаги следующие (среда Linux VM, хотя я уверен, что другие среды аналогичны):

  1. Запустите jconsole на вашем компьютере
  2. Найдите правильный идентификатор процесса и прикрепите к нему jconsole (это займет несколько минут)
  3. Перейдите на вкладку "Память".
  4. В раскрывающемся списке "Диаграмма:" выберите "Пул памяти" Кэш кода ".
  5. Опять же, это может занять некоторое время, прежде чем экран обновится, после чего вы должны увидеть что-то вроде: изображение кеша кода jconsole

    Как видите, мой кеш кода занимает около 49 МБ. На данный момент у меня все еще было значение по умолчанию, которое, как сказано в документации (и @jeha), составляет 48 МБ. Безусловно, это отличная мотивация для меня увеличить настройку!

    Бен.


    1024 МБ по умолчанию, вероятно, переусердствовали, но 48 МБ по умолчанию, похоже, недостаточно ...

Животные451
источник
Хорошее предложение .... Я пытаюсь использовать -J-XX: ReservedCodeCacheSize = 512m
MarcoZen
Netbeans не начинал с 512 м, а с 256 м
MarcoZen
И после тестирования в течение примерно 2 дней я могу сказать, что настройка не показала никаких / каких-либо заметных улучшений и вместо этого сделала netbeans навеселе. В итоге я просто удалил его.
MarcoZen
3

Хороший опыт обучения от команды разработчиков Indeed и проблемы, с которыми они столкнулись при переходе на jdk 8.

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

Вывод: Jdk 8 требует больше кеша кода, чем JDK 7

Размер кодового кеша по умолчанию для JRE 8 составляет около 250 МБ, что примерно в пять раз больше, чем 48 МБ по умолчанию для JRE 7. По нашему опыту, JRE 8 требует этого дополнительного кодового кеша. На данный момент мы переключили на JRE 8 около десяти сервисов, и все они используют примерно в четыре раза больше кодового кеша, чем раньше.

всингх
источник
0

из https://blogs.oracle.com/poonam/entry/why_do_i_get_message :

Ниже приведены две известные проблемы в jdk7u4 +, связанные с очисткой CodeCache:

  1. Компилятор может не перезапуститься даже после того, как занятость CodeCache упадет почти до половины после аварийной очистки.
  2. Экстренная очистка может вызвать высокую загрузку ЦП потоками компилятора, что приведет к общему снижению производительности.

Эта проблема с производительностью, а также проблема того, что компилятор не включается снова, были решены в JDK8. Чтобы обойти это в JDK7u4 +, мы можем увеличить размер кэша кода, используя параметр ReservedCodeCacheSize, установив для него значение, превышающее размер скомпилированного кода, чтобы CodeCache никогда не заполнялся. Другое решение - отключить очистку кэша кода с помощью параметра -XX: -UseCodeCacheFlushing JVM.

Вышеупомянутые проблемы были исправлены в JDK8 и его обновлениях.

Так что эту информацию стоит упомянуть для систем, работающих на JDK 6 (с отключенным сбросом кода) и 7.

Андре Штейнгресс
источник