@ Ответ Jigar показывает, как вы можете отслеживать события GC.Однако я не думаю, что это позволило бы потоку измерить, как долго он ... или другой поток ... был приостановлен.
И на самом деле, я подозреваю, что нет способа измеритьэто.
Действительно, я не думаю, что есть способ измерить и другие виды пауз;например,
- паузы из-за ожидания при вводе-выводе
- паузы из-за синхронизации или
- паузы из-за квантования времени, управляемого ОС.
Я не думаю, что то, что вы хотите сделать, выполнимо, не говоря уже о желательности.
Рассматривая ваши требования:
Я пишу программу, которая можету меня длинные GC-паузы, однако SLA сказал, что их не должно быть слишком много.И он должен сообщить, если он найдет.
SLA, вероятно, не составлен в терминах пауз GC 1 .Это будет сформулировано с точки зрения времени отклика.Это имеет большое значение.Время отклика намного проще измерить, чем паузы ГХ.
Маловероятно, что SLA говорит, что вам нужно измерить время отклика (или что-то еще) в самом приложении.Поэтому измерьте его снаружи:
- Анализ событий журнала приложения / веб-контейнера в отдельной системе мониторинга в реальном времени;например, Nagios, CheckMk, и так далее.
- Сканирование файлов журнала приложения / веб-контейнера по факту.
- Подключите мониторинг пакетов или потоков к чему-то, что записывает время отклика.
Если вы решите игнорировать 2), учтите, что любая дополнительная инфраструктура, которую вы добавите в свое Java-приложение для «самоконтроля», сделает его более сложным, и (еслиВы осторожны) добавьте к загрузке ГХ, делая паузы ГХ более частыми .
Короче говоря: поскольку вам, вероятно, не требуется делать это, мой продуманный совет НЕ пытаться обнаружитьGC делает паузу в самом приложении.
1 - Если это так, то кто-то допустил ошибку при написании / согласовании SLA!