Тайна памяти Java (у меня есть утечка)?

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

5
задан erotsppa 25 September 2009 в 04:27
поделиться

5 ответов

Пара потенциальных проблем:

  • Прямые выделенные буферы и файлы с отображением памяти выделяются вне кучи Java и не могут быть удобно размещены.
  • Область стека зарезервирована для каждого нового потока.
  • Постоянная генерация (код и интернированные строки) находится вне обычного стека. Проблема может быть в утечке загрузчиков классов (обычно при перезагрузке веб-приложений).
  • Возможно, происходит утечка из кучи C.

pmap -x должен показать, как исчезла ваша память.

9
ответ дан 13 December 2019 в 05:38
поделиться

Поменять местами Sun и IBM JVM для тестирования


  1. RES будет включать код + данные без заголовка. Кроме того, некоторые вещи, которые, как вы думаете, будут храниться в куче, не хранятся, например, стек потока и «данные класса». (Это вопрос определения, но код и данные класса управляются параметром -XX: MaxPermSize = .)

  2. Это похоже на утечку памяти либо в реализации JVM, либо в ядре Linux, либо в библиотеке. Код JNI.

Если вы используете Sun JVM, попробуйте IBM, или наоборот.

Я не совсем уверен, как работает dlopen, но код доступа к системным библиотекам может повторно отображать одно и то же, если это возможно.

12153] Наконец, вы должны использовать ulimit , чтобы система отказала раньше, чтобы вы могли легко повторять тесты.

1
ответ дан 13 December 2019 в 05:38
поделиться

Похоже, у вас утечка. Разве вы не можете выполнить профилирование, чтобы увидеть, какая функция увеличивает объем памяти? Хотя я не уверен.

0
ответ дан 13 December 2019 в 05:38
поделиться

Если бы мне пришлось нанести удар в темноте, я бы сказал, что используемая вами JVM имеет утечку памяти.

0
ответ дан 13 December 2019 в 05:38
поделиться

WRT # 1, ваш RSS может быть больше, чем куча. Это связано с тем, что в RSS включены системные библиотеки и код, отличный от Java, но не размер кучи .

WRT # 2, Да, похоже, у вас какая-то утечка. Если сама система дает сбой, вы, вероятно, потребляете слишком много системных ресурсов, таких как сокеты, потоки или файлы.

Попробуйте использовать lsof, чтобы узнать, какие файлы открыты JVM. Выполните это несколько раз по мере увеличения вашей памяти. Если JVM дает сбой, обязательно установите параметр -XX: + HeapDumpOnOutOfMemoryError .

1
ответ дан 13 December 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: