какой скомпилированный код хранится в области JVM CodeCache - PullRequest
1 голос
/ 12 июля 2019

Загрузка ЦП одного сервера постепенно снизилась до 100%, и я обнаружил, что область CodeCache заняла 231 МБ, а пороговое значение составляет 240 м.

С другим сервером в моем кластере все в порядке, загрузка ЦП составляет 30%, а область CodeCache занята110M.

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

Существует ли дамп кэша кода?

PS: JDK версия составляет 1,8

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Вот простая программа, которую вы можете использовать для выгрузки CodeCache на JDK 8.

import sun.jvm.hotspot.code.CodeBlob;
import sun.jvm.hotspot.code.CodeCacheVisitor;
import sun.jvm.hotspot.debugger.Address;
import sun.jvm.hotspot.runtime.VM;
import sun.jvm.hotspot.tools.Tool;

public class DumpCodeCache extends Tool {

    @Override
    public void run() {
        VM.getVM().getCodeCache().iterate(new CodeCacheVisitor() {

            public void prologue(Address start, Address end) {
            }

            public void visit(CodeBlob blob) {
                System.out.printf("%8d  %s\n", blob.getSize(), blob.getName());
            }

            public void epilogue() {
            }
        });
    }

    public static void main(String[] args) {
        new DumpCodeCache().execute(args);
    }
}

Инструмент основан на технологии Serviceabiliy Agent .
Чтобы скомпилировать и запустить его, включите $JAVA_HOME/lib/sa-jdi.jar в classpath.

java -cp $JAVA_HOME/lib/sa-jdi.jar:. DumpCodeCache PID

Начиная с JDK 9 есть встроенная функция для выгрузки CodeCache с помощью jcmd:

jcmd PID Compiler.codelist

Начиная с JDK 11 появилась еще более мощная команда для вывода подробной статистики CodeCache:

jcmd PID Compiler.CodeHeap_Analytics
1 голос
/ 12 июля 2019

С более новыми версиями JDK вы можете использовать jcmd Compiler.codecache и jcmd Comiler.codelist.Начиная с версии 1.8, попробуйте -XX: + PrintCodeCache или –XX: + PrintCodeCacheOnCompilation, хотя это даст вам только сводную статистику (см. Есть ли способ контролировать кэш скомпилированного кода в Java? ).

Команда jcmd codelist обрабатывается методом JVM CodeCache::print_codelist, но это недоступно в JDK 8 - все, что там есть print_summary.

PS: Я также пытался сгенерировать дамп ядра с помощью gcore, но не смог понять, как анализировать кэш кода таким образом.

...