Я работаю над приложением, цель которого - вычисление отчетов, как можно быстрее.Как найти, что Finalizer занимает много времени
Мое приложение использует большой объем памяти; более 100 Go.
С нашей последней версии я замечаю значительное замедление производительности. Мое расследование показывает, что во время вычислений я получаю много сбора мусора между 40 и 60 секундами !!! (JMC говорит мне, что они SerialOld, но я не знаю, что это точно означает) и, конечно же, когда JVM является мусор сбора, применение абсолютно отмороженные
Я сейчас расследующим происхождение этих сборщиков мусора ... и это очень тяжелая работа.
Я подозреваю, что, если эти коллекции мусора настолько долго, это происходит потому, что они много раз проводить в finalize
функции (я знаю, что среди всех библиотек мы интегрируем от других команд, некоторые из них используют финализаторы)
Однако я не знаю, как сопоставить (или нет) эту гипотезу; Как найти, какой финализатор занимает много времени.
Ищу хороший инструмент или даже хорошую методологию
Вот данные, собранный с помощью JVisualVM
Как вы можете видеть, у меня всегда есть много «Pending Финализаторов», когда у меня есть a log Old Garbage
Удивительно то, что при использовании JVisualVM приведенный выше график регулярно прокручивается справа налево. Когда старый мусор срабатывает, прокрутка останавливается (пока здесь, это нормально, это конец света). Однако, когда прокрутка внезапно перезагружается, он делает не с конца старого мусора, но с конца Pending Serializer
Это позволяет мне думать, что финализаторы преграждали виртуальная машина
ли кто-нибудь имеет объяснений для это?
Большое спасибо Philippe
методы 'finalize' * не * выполняются во время сбора мусора. – apangin
уверен? Даже для сбора мусора «SerializeOld»? Спасибо за ваш ответ –
Абсолютно. Java-код не запускается во время несовпадающих фаз GC. GC только * обнаруживает * завершаемые объекты и добавляет их в очередь. Эта очередь позже обрабатывается ['Finalizer'] (http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/8b04ee324a1a/src/share/classes/java/lang/ref/Finalizer.java# l186) Java-поток, который работает вместе с другими потоками Java. – apangin