#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 и перейдите к представлению «Самые большие объекты». Это представление, вероятно, покажет вам, что хранится во всех этих объектах.