Введение в кеш кода JVM

Введение в кэш кода JVM

1. Вступление

В этом руководстве мы кратко рассмотрим и узнаем о кэш-памяти кода JVM.

2. Что такое кэш кода?

Проще говоря,JVM Code Cache is an area where JVM stores its bytecode compiled into native code. Мы называем каждый блок исполняемого нативного кодаnmethod. nmethod может быть полным или встроенным методом Java.

JIT-компилятор является крупнейшим потребителем области кэша кода. Вот почему некоторые разработчики называют эту память кешем JIT-кода.

3. Настройка кэша кода

The code cache has a fixed size. После его заполнения JVM не будет компилировать дополнительный код, поскольку JIT-компилятор отключен. Кроме того, мы получим предупреждающее сообщение“CodeCache is full… The compiler has been disabled ». В результате производительность нашего приложения снизится. Чтобы избежать этого, мы можем настроить кэш кода со следующими параметрами размера:

  • InitialCodeCacheSize - начальный размер кэша кода, по умолчанию 160 КБ

  • ReservedCodeCacheSize - максимальный размер по умолчанию составляет 48 МБ

  • CodeCacheExpansionSize - размер расширения кэша кода, 32КБ или 64КБ

Решением может быть увеличениеReservedCodeCacheSize, но обычно это только временное решение.

К счастью, JVM предлагаетUseCodeCacheFlushing option to control the flushing of the code cache area. Значением по умолчанию является false. Когда мы его включаем, онfrees the occupied area when the following conditions are met:

  • кеш кода заполнен; this area is flushed if its size exceeds a certain thresholdс

  • определенный интервал пройден с момента последней очистки

  • предварительно скомпилированный код недостаточно горячий. Для каждого скомпилированного метода JVM отслеживает с помощью специального счетчика температуры. Если значение этого счетчика меньше вычисленного порога, JVM освобождает этот фрагмент предварительно скомпилированного кода

4. Использование кэша кода

Чтобы отслеживать использование кеша кода, нам необходимо отслеживать размер используемой в данный момент памяти.

To get information on code cache usage, we can specify the –XX:+PrintCodeCache JVM option. После запуска нашего приложения мы увидим аналогичный результат:

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

Давайте посмотрим, что означает каждое из этих значений:

  • size in вывод показывает максимальный размер памяти, который идентиченReservedCodeCacheSize

  • used - это фактический размер используемой в данный момент памяти.

  • max_used - максимальный размер, который использовался

  • free - это оставшаяся память, которая еще не занята

ПараметрPrintCodeCache очень полезен, поскольку мы можем:

  • посмотрим, когда происходит промывка

  • определить, достигли ли мы критической точки использования памяти

5. Заключение

В этой быстрой статье представлено краткое введение в кэш кода JVM.

Кроме того, мы представили некоторые варианты использования и настройки для мониторинга и диагностики этой области памяти.