Статистика сбора мусора в результате Java Flight Recorder - PullRequest
0 голосов
/ 18 мая 2018

В нашем CI есть работа, которая запускает наше Java-приложение и запускает некоторый тест (тест действует как клиент для приложения).Приложение запускается с тем, что я считаю правильным вариантом JVM для непрерывной записи полета:

-XX:+UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -XX:+FlightRecorder -XX:FlightRecorderOptions=dumponexit=true,dumponexitpath=/tmp/application-flightRecorder.jfr -XX:StartFlightRecording=defaultrecording=true,settings=customSetting -XX:+DebugNonSafepoints

Он прекрасно создает файл JFR, и я могу открыть его в Java Mission Control.В дополнение к описанному выше варианту JVM у нас также есть возможность включить ведение журнала GC: * ​​1004 *

-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintFlagsFinal -XX:+PrintHeapAtGC -XX:+PrintReferenceGC -XX:+PrintTenuringDistribution -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+LogVMOutput -XX:LogFile=/tmp/application-safepoint.log -Xloggc:/tmp/application-gc.log

Что тоже хорошо.Создаются файлы журнала gc и безопасная точка.Тем не менее, я заметил, что в статистике GC в управлении полетом не перечислены все GC, которые произошли за время существования приложения.Например, если я открою журнал gc с помощью GCViewer (https://github.com/chewiebug/GCViewer),, там происходит значительно больше GC.

Я что-то здесь упустил? Или управление полетами выводит только "значительный" gc?

Заранее спасибо!

1 Ответ

0 голосов
/ 20 мая 2018

JFR использует кольцевой буфер, поэтому в какой-то момент события для старых GC сбрасываются, но вы не должны получать пробел.

Я заметил, что вы используете собственный JFC-файл, может быть, вы отключили некоторые события GC, например, молодые коллекции?

Возможно, вы захотите записать запись на диск(disk = true) и установите maxage = 1h (или то, что вам нужно), чтобы старые события не удалялись.

...