Точка безопасности журнал статистики без операции vmop на выходе JDK12

#java #jvm #zgc

#java #jvm #zgc

Вопрос:

Я запускаю приложение на JDK12 с -Xlog:safepoint stats =debug:file = safepoint.регистрируйте параметр виртуальной машины для регистрации действий safepoint и запуска с ZGC. У меня проблема с пониманием вывода журнала:

 [1408.417s][debug][safepoint,stats]           vmop                            [ threads:    total initially_running wait_to_block ][ time:    spin   block    sync cleanup    vmop ] page_trap_count
[1412.164s][debug][safepoint,stats] 1412.162: ZOperation                    [               376                 0             7 ][             0       0       0       0       1 ]               7
[1413.164s][debug][safepoint,stats] 1413.164: None                          [               376                 0             0 ][             0       0       0       0       0 ]               0
[1414.165s][debug][safepoint,stats] 1414.164: None                          [               376                 0             1 ][             0       0       0       0       0 ]               1
  

Я понимаю первую строку, в которой говорится, что операция ZOperation заняла 1 миллис, и 7 потоков внесли свой вклад в блокировку.

Я не понимаю вторую строку, что такое операция vmop «None»? Похоже, что продолжительность этой операции равна 0. Это действительно 0 или это 0, потому что это заняло менее 1 миллисекунды? Если да, то можно установить более высокую степень детализации регистрации времени, чтобы увидеть, сколько наносекунд это заняло? или микросекунды?

У меня многие из этих операций «Нет» регистрируются за секунды. Я хотел бы знать, что делает JVM во время этой паузы. Я отслеживаю время ZGC и время безопасной точки каждые 10 секунд, и совокупное время безопасной точки в 5 раз превышает совокупное время паузы gc. Я хотел бы каким-то образом уменьшить это время безопасной точки для моего приложения.

Ответ №1:

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

Если необходимо выполнить задачи очистки, обязательная точка безопасности выполняется каждые GuaranteedSafepointInterval миллисекунды. Значение по умолчанию равно 1000. Обратите внимание, что в вашем случае точка безопасности без операции происходит ровно через 1 секунду после предыдущей точки безопасности.

Интервал может быть настроен с помощью

 -XX: UnlockDiagnosticVMOptions -XX:GuaranteedSafepointInterval=<ms>
  

Чтобы избежать путаницы, в JDK 13 такие безопасные точки без операций получили Cleanup название операции.