Рубрики
Без рубрики

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

Узнайте об использовании кэш памяти кода Jvm и настройках настройки

Автор оригинала: baeldung.

1. введение

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

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

Проще говоря, Кэш кода JVM-это область, где JVM хранит свой байт-код, скомпилированный в машинный код . Каждый блок исполняемого машинного кода мы называем методом . Метод | может быть полным или онлайновым методом Java.

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

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

Кэш кода имеет фиксированный размер . Как только он заполнится, JVM не будет компилировать никакой дополнительный код, так как JIT-компилятор теперь выключен. Кроме того, мы получим “Кодек-кэш заполнен… Компилятор был отключен ” предупреждающее сообщение. В результате мы получим ухудшение производительности нашего приложения. Чтобы избежать этого, мы можем настроить кэш кода со следующими параметрами размера:

  • InitialCodeCacheSize – начальный размер кэша кода, по умолчанию 160K
  • ReservedCodeCacheSize – максимальный размер по умолчанию составляет 48 МБ
  • CodeCacheExpansionSize – размер расширения кэша кода, 32 КБ или 64 КБ

Увеличение ReservedCodeCacheSize может быть решением, но обычно это только временный обходной путь.

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

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

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

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

Чтобы получить информацию об использовании кэша кода, мы можем указать параметр –XX:+PrintCodeCache JVM . После запуска нашего приложения мы увидим аналогичный результат:

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

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

  • size в выводе отображается максимальный размер памяти, который идентичен ReservedCodeCacheSize
  • used – это фактический размер используемой в данный момент памяти
  • max_used – это максимальный размер, который был использован
  • free – это оставшаяся память, которая еще не занята

Опция PrintCodeCache очень полезна, так как мы можем:

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

5. Сегментированный Кэш Кода

Начиная с Java 9 , JVM делит кэш кода на три отдельных сегмента, каждый из которых содержит определенный тип скомпилированного кода . Чтобы быть более конкретным, есть три сегмента:

  • Сегмент non-method содержит внутренний связанный код JVM, такой как интерпретатор байт-кода. По умолчанию этот сегмент составляет около 5 МБ. Кроме того, можно настроить размер сегмента с помощью флага настройки -XX:NonNMethodCodeHeapSize
  • Сегмент профилированного кода содержит слегка оптимизированный код с потенциально коротким временем жизни. Несмотря на то, что размер сегмента по умолчанию составляет около 122 МБ, мы можем изменить его с помощью флага настройки -XX:ProfiledCodeHeapSize
  • Непрофильный сегмент содержит полностью оптимизированный код с потенциально длительным сроком службы. Точно так же по умолчанию он составляет около 122 МБ. Это значение, конечно, настраивается с помощью флага настройки -XX:NonProfiledCodeHeapSize

Эта новая структура по-разному обрабатывает различные типы скомпилированного кода, что приводит к повышению общей производительности.

Например, отделение короткоживущего скомпилированного кода от долгоживущего кода повышает производительность метода sweeper-главным образом потому, что он должен сканировать меньшую область памяти.

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

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

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