Как программно перехватить GC для печати информации в мой журнал - PullRequest
3 голосов
/ 24 марта 2012

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

Есть надежда здесь?

Ответы [ 6 ]

3 голосов
/ 25 марта 2012

Вы не можете подключить механизм регистрации GC изнутри Java-программы, потому что когда GC-поток (-ы) запускается, JVM эффективно останавливается. Это может привести к тупику, и это хорошо, что мы не можем. Даже использование собственного средства запуска для попытки перехвата с помощью некоторого метода повторного открытия дескриптора и вызова на Java может привести к тупику. Возможно, если бы было возможно возобновить работу из пользовательского модуля запуска (я не знаю, так или иначе), буферизация данных и переход с Java на нативный через JNI для получения буфера могли бы работать.

2 голосов
/ 30 сентября 2015

Начиная с Java7u4, вы можете получать уведомления от GarbageCollectorMXBean. Смотри http://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GarbageCollectionNotificationInfo.html

Вот хороший пример: http://www.fasterj.com/articles/gcnotifs.shtml

2 голосов
/ 24 марта 2012

Я не думаю, что это можно сделать напрямую. AFAIK, эта запись ведется на очень низком уровне и фактически находится за пределами досягаемости обычных программ на Java.

Вместо этого, я думаю, вам придется настроить JVM для записи сообщений GC в известный файл (с использованием опций JVM), а затем использовать файл-обработчик для чтения сообщений по мере их записи в файл.

1 голос
/ 24 октября 2012

Вы можете использовать параметр JVM -Xloggc:[filename]

1 голос
/ 24 марта 2012

Вы можете перенаправить System.out и System.err в файл журнала. Вот пример для java.util.logging здесь . Другие пакеты могут делать то же самое, AFAIK.

0 голосов
/ 05 апреля 2014

Вы можете добавить свой код перехватчика в методе 'finalze ()', но для этого вы должны переопределить метод finalize для всех ваших объектов.

Обратите внимание, что метод finalize не обязательно вызывается перед процессом GC.

...