2

Предположим, что у нас есть задача java, которая работает изолированно, и мы можем контролировать ее с помощью visualvm ... и мы замечаем непрерывное создание мусора и периодический gc, как это.java устранение вывоза мусора

enter image description here

Как мы обнаружим, что именно является причиной проблемы

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

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

Как мы обычно это делаем? какие инструменты использовать? любые ссылки на темы по этому поводу приветствуются

ПРИМЕЧАНИЕ проблема здесь не оптимизации параметров GC, а оптимизация кода, мы хотим устранить создание ненужных объектов, возможно, использовать примитивы вместо т.д ...

+4

Сбор мусора - совершенно нормальная часть жизненного цикла приложения Java. Почему, в частности, тот факт, что это происходит? Какие проблемы вызывает проблема, которую вы пытаетесь решить? – JonK

+0

Я обновил последнюю часть, но да, вы правы, и я знаю, что любое приложение jvm должно это сделать, но в этом случае мы хотим оптимизировать код, нам нужно определить, какой код создает эти ненужные объекты. Все, что я вижу, это то, что мое приложение выделяет много байтов [] и char [], но где, когда от какой функции? thats проблема – vach

+0

GC не проблема, ее частота этого, которая вызывает проблемы, я хочу оптимизировать код, чтобы этот GC разбрасывался в 10 раз реже или больше ... Да, я могу читать весь исходный код, но я бы хотел получить инструмент, который мог бы анализировать и дать мне ключ, где создается мусор ... – vach

ответ

2

Самый простой способ - использовать такой инструмент, как JProfiler и записать записи. В представлении «Распределение HotSpot» будет показано, в каком методе ваше приложение распределяет объекты. Более подробную информацию вы можете найти here

Если вы не можете использовать профайлер, то другой подход - взять heapdump и исследовать содержащиеся в нем объекты. Затем на основе этой информации предполагается, в каком методе они создаются.

+0

из visual vm я вижу, что большая часть памяти - это байт [] или char [], но это может быть что угодно, где угодно ... jprofiler показывает, какой метод сгенерировал какие объекты? – vach

+1

@Vach yes - вы увидите его в дереве вызовов распределения. –

+0

Может ли YourKit сделать то же самое? возможно, вы использовали его – vach

1

Я бы предложил установить плагин VisualGC в jvisualvm. Это даст вам очень хорошее представление о количестве мелких и полных GCs.

enter image description here

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