Подтвердить что ты не робот

Почему char [] выживает так много поколений, и я должен быть обеспокоен?

Я впервые просматриваю профайлер в NetBeans, и сегодня утром я заметил, что у меня было более 1700 выживших поколений, показанных через профилировщик Monitor, но постоянный размер кучи. Сделав некоторое чтение, я нашел эту статью, в которой обсуждается использование профилировщика NetBeans для выявления утечек.

Итак, следуя советам по статьям, я начал профайлер памяти. Рассматривая результаты, я обнаружил, что char [] учитывает большинство выживших поколений. В настоящее время на этом посту char [] находится в 22 поколениях и подсчитывается.

Теперь некоторые сообщения (комментарий от OldCurmudgeon у основания) показывают, что если моя куча стабильная, утечки нет а другие говорят, что если поколения будут продолжать расти, есть. Поэтому я немного смущен, что правильно.

Итак, мой вопрос:

Основываясь на следующих снимках экрана, я должен продолжить изучение потенциальных утечек памяти?

Memory(Heap) Память (кучи)

Memory(GC) Память (ГХ)

Live allocated objects Живые выделенные объекты

4b9b3361

Ответ 1

char[], вероятно, будет удерживаться объектами String. Они могут быть созданы где угодно для любых целей, например. профилировщик и JMX используют их так, что процесс, который ничего не делает, покажет эти (и растущую кучу)

Примечание: все литералы String и имена классов и т.д. сохранится до тех пор, пока ClassLoader не будет выгружен (это может означать срок службы программы)

Чтобы определить, растет ли ваше использование кучи, вы должны посмотреть, сколько осталось после полного GC. Посмотрите на дно каждого провала, и он кажется мне таким же. Другая информация полезна для настройки производительности, но сама по себе это не проблема.

Ответ 2

Я также столкнулся с этими затяжными char [] во время моих профилей. После долгого анализа я пришел к выводу, что многие из них представляют собой массивы char пулов констант String.

Ответ 3

Не глядя на код, нельзя сказать. Существуют программы, в которых используется ТБ памяти, и они работают хорошо, потому что это не утечка памяти, а просто как работает программа.

Документация Netbeans определяет, что выживают поколения, а не как использовать эту цифру для обнаружения утечки памяти. Более того, a char[] является просто содержимым String, и его можно сохранить очень долго (даже до основного потока).

Там нет волшебной пули, чтобы найти утечки. Вы должны запустить свою программу под допустимой нагрузкой и посмотреть, соответствует ли использование памяти ожидаемому шаблону. Если это не так, значит, у вас есть проблема, но без контекста этот граф ничего не значит.