Утечка памяти в Java, нехватка памяти в куче, не связанная с размером кучи

#java #memory #memory-leaks

#java #память #утечки памяти

Вопрос:

введите описание изображения здесьМоя программа столкнулась с ошибкой нехватки места в куче. Я увеличил размер кучи, но это не помогло. После профилирования программы я получил результат, который подразумевает, что 37,8% памяти кучи потребляется Integer.parseInt (строка). Я строго использую Integer.parseInt (String) в своей программе из-за моего предположения, что он возвращает примитив и собирается GC. Но этого не происходит. Кто-нибудь может пролить свет на то, почему обычно происходит такое поведение?введите описание изображения здесь

Комментарии:

1. Глупый вопрос, но вы уверены, что создали профиль памяти, а не производительности? Это придало бы parseInt результату намного больше смысла.

2. Добавлен еще один снимок, показывающий профилировщик. Я надеюсь, вы поймете, что я пытаюсь спросить, почему примитивные типы не собираются GC. Есть ли лучший способ устранить утечку памяти?

3. Примитивные типы не собираются GC, потому что GC собирает только объекты. На первом скриншоте показано, что каким-то образом ваша программа сохраняет 235 392 java.lang.Integer объекта — вероятно, из-за добавления их в некоторые java.util.ArrayList объекты (которых насчитывается 191 830 экземпляров)

4. Поскольку вы используете JProfiler, сделайте снимок кучи в heap walker и перейдите к представлению «Самые большие объекты». Это представление, вероятно, покажет вам, что хранится во всех этих объектах.