Может ли вызвать STW при выполнении jcmd GC.class_stats?
Я собираюсь казнить jcmd $PID GC.class_stats -csv=true
в моем процессе tomcat, чтобы получить статус загруженного класса.
Меня беспокоит влияние команды на процесс tomcat, например создание дампа кучи.
Может ли вызвать остановку мира или другой эффект при выполнении команды?
Я не могу найти об этом.
Спасибо.
1 ответ
Да, GC.class_stats
- это диагностическая команда с высокими накладными расходами, выполняемая в глобальной точке безопасности (пауза STW). Помимо прочего, эта операция просматривает всю кучу, чтобы вычислить память, используемую всеми экземплярами всех загруженных классов.
Кроме того, операция вызывает полный сборщик мусора. Смотрите исходный код:
void ClassStatsDCmd::execute(DCmdSource source, TRAPS) {
VM_GC_HeapInspection heapop(output(),
true /* request_full_gc */);
heapop.set_csv_format(_csv.value());
heapop.set_print_help(_help.value());
heapop.set_print_class_stats(true);
...
VMThread::execute(&heapop); <-- VM_GC_HeapInspection runs in a global safepoint
}
jcmd <pid> help GC.class_stats
также предупреждает, что команда имеет большое влияние на виртуальную машину:
GC.class_stats
Provide statistics about Java class meta data.
Impact: High: Depends on Java heap size and content.
Кстати, GC.class_stats
был удален в JDK 15.