Java (горячая точка) verbose: использование вывода gc в приложении и процесс во время выполнения

Есть ли способ подключить стандартный вывод текущего процесса JVM или перенаправить стандартный вывод процесса JVM в место, отличное от файла?

Мне нужен подробный: gc вывод JVM для моего приложения, в настоящее время я вижу этот вывод в консоли, но не могу сохранить его в базе данных или обработать каким-либо образом, он невидим для запуска java-приложения.

System.err System.out

Оба являются обертками над нативами, внутренний вывод JVM здесь не проходит. Оба не могут видеть этот вывод (если он перенаправлен или установлен на null, вывод gc отображается в консоли).

Запись verbose:gc в файл, а затем чтение файла недействительны из-за проблем с производительностью и блокировок файловой системы, проверка источников горячих точек не дает возможности перенаправить вывод в расположение, отличное от файла, с помощью флагов запуска JVM.

Также мне не удалось получить объект Process запущенной JVM, для этого нет методов, также я не смог найти родной объект, который выставляет объект Process, так что до сих пор нет действительного способа прочитать эти данные.

Любые подсказки о том, как читать verbose: gc во время выполнения?


person user2978478    schedule 11.11.2013    source источник
comment
Вы хотите видеть, когда работает GC, или каково ваше намерение?   -  person markusw    schedule 11.11.2013
comment
неверный вариант из-за проблем с производительностью и блокировок файловой системы ... дайте угадаю.... вы пользователь Windows???   -  person maaartinus    schedule 11.11.2013
comment
протестировано только на Windows, но я не делал ничего конкретного для платформы, намерение таково: приложение, работающее на клиентах, должно сообщать серверу о состоянии памяти во время выполнения, это академическое приложение без какой-либо реальной цели.   -  person user2978478    schedule 22.11.2013


Ответы (2)


Запись verbose:gc в файл, а затем чтение файла недопустимой опции из-за проблем с производительностью и блокировок файловой системы,

Стоимость этого тривиальна по сравнению со стоимостью фактического сбора мусора. Если у вас нет системы, которая никогда не должна нормально выполнять сборщик мусора, я бы не стал об этом беспокоиться. Если вас беспокоит, что вы не можете прочитать файл из-за блокировки Windows, у вас может быть проблема (или вы можете использовать ОС, такую ​​как Linux, которая этого не делает)

Обратите внимание, что вывод GC в файл буферизуется, поэтому он не в реальном времени (но достаточно близко для большинства случаев использования).

Чтение вывода программно очень сложно, особенно потому, что оно написано многопоточным сборщиком мусора, т.е. вы получаете странное переупорядочение информации.

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

person Peter Lawrey    schedule 11.11.2013

Вы можете получить информацию о паузе GC через JMX. Он не такой полный, как журналы GC, но убережет вас от синтаксического анализа. инструмент SJK — это инструмент командной строки, который может отслеживать события GC запущенных процессов JVM. Вы можете использовать его или использовать его код для создания индивидуального решения.

jstat — еще один вариант, но он предоставляет меньше информации по сравнению с JMX, а его форматирование вводит в заблуждение в случае сборщика CMS.

Проблемное использование PerfCounter API — третий вариант (jstat использует его для внутренних целей). Подробнее см. в sun.management.counter.perf.PerfInstrumentation классе.

person Alexey Ragozin    schedule 11.11.2013