Утечка памяти в Java-приложении - PullRequest
1 голос
/ 28 октября 2010

В приложении возникает утечка памяти, когда недолговечный объект содержит долгоживущий объект. Мой вопрос: как мы можем определить 1) какой объект живет дольше и короче, какой-либо инструмент, который измеряет жизнь объекта?

2-й вопрос

Я постоянно получаю сообщение об ошибке «Недостаточно места в памяти», и я пытался увеличить объем памяти кучи до 2 ГБ, но все равно получаю, пожалуйста, предложите мне открытьисходный инструмент, с помощью которого я могу определить проблему и устранить утечку памяти.

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

Ответы [ 7 ]

5 голосов
/ 28 октября 2010

Вы можете использовать инструмент VisualVM, включенный в JDK:

Документация доступна здесь:

1 голос
/ 28 ноября 2010

Как уже было сказано, у jvisualvm есть хорошие инструменты для анализа динамической памяти кучи.

Но вы также можете использовать jvisualvm или -XX: + HeapDumpOnOutOfMemoryError, чтобы получить дамп кучи в файле. А затем перенесите файл в свой destkop, чтобы открыть его в Eclipse Memory Analyzer . Eclipse MAT еще лучше анализирует память.

1 голос
/ 28 октября 2010

Я нашел Heap Walker в Netbeans очень полезным

1 голос
/ 28 октября 2010

Есть 2 варианта:

  • Возможно, вашему приложению недостаточно выделенной памяти. Измерьте размер вашего ввода и дайте приложению соответствующую кучу;

  • Есть утечка памяти: возьмите профилировщик, изучите вашу кучу, найдите объекты, которых не должно быть там или там, где их слишком много («короткоживущие объекты», в ваших терминах), определите, какие «долгоживущие» живой объект держит их, исправьте это. Вы должны знать свой код, чтобы понять, какие объекты должны быть «недолговечными», а какие «долгоживущими».

0 голосов
/ 28 октября 2010

Недолговечный объект, содержащий ссылку на долгоживущий объект, не вызовет проблем.(хороший обзор , включая сборку мусора поколений).

2ГБ - это очень много объектов / ссылок.Если вам не хватает места в куче на 2 ГБ, вы, вероятно, держитесь за огромные объемы данных и / или сохраняете открытые ресурсы, когда закончите с ними.По крайней мере, вы должны опубликовать описание того, что делает ваше приложение, и сколько времени потребуется, чтобы умереть.

Вы можете получить некоторое представление о том, что происходит быстро, наблюдая за сборщиком мусора (например, запустите «-verbose: gc», который сообщит вам, когда сборщик мусора работает и сколько он собирает).

0 голосов
/ 28 октября 2010

Я думаю, что вы можете отслеживать утечки памяти с помощью jsconsole (который поставляется с JDK6, если я не ошибаюсь).

0 голосов
/ 28 октября 2010

Недостаточно памяти на сервере, потому что он буквально использует всю память, которую ему разрешено иметь.Не уверен насчет того, какое приложение вы используете для размещения сервера, но для Apache вам нужно добавить строку -Xmx512m, где 512 - это максимальный размер мегабайта, который он может иметь.

Если вы выходите из приложениябежать достаточно долго, это произойдет.Это происходит не из-за утечек памяти в Java, а из-за самого сервера, который склонен это делать.Вы не можете изменить это поведение, но вы можете по крайней мере увеличить объем памяти по умолчанию до 256 МБ.С сайтом с большой нагрузкой, над которым я работаю каждый день, 256 мегабайт длится, к сожалению, около 30 минут.Я обнаружил, что 1024 мегабайта разумно и редко дает сбой из-за нехватки памяти.

Мне кажется очень необычным, что Java неспособна правильно собирать мусор, если программист не приложил руку к переопределениютипичная функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...