Почему общее использование памяти моей JVM более чем в 30 раз превышает значение Xmx? - PullRequest
9 голосов
/ 15 марта 2012

Я запускаю приложение Java с максимальным размером кучи 128 МБ (-Xmx128M). Он работает до успешного завершения без OutOfMemoryError или любого другого необработанного исключения. Поэтому я предполагаю, что его фактический размер кучи остался в пределах заявленного предела в 128 МБ.

Однако, наблюдая за процессом для этого Java-приложения, я вижу пиковое общее использование памяти в размере 4 188 548 КБ (~ 4 ГБ). Это рост более чем в 30 раз превышает контролируемый максимальный размер кучи. Хотя я понимаю, что это значение включает в себя выделенную виртуальную память, которая может быть значительно больше, чем фактическая используемая физическая память, она влияет на жесткие ограничения, такие как ограничения, установленные Sun Grid Engine, и, следовательно, имеет смысл.

Как именно это возможно? Я понимаю, что общая память, используемая JVM, включает в себя немного больше, чем размер кучи, но я не понимаю, как ему может потребоваться несколько ГБ дополнительной памяти, помимо того, что приложение фактически нуждается для создания своих объектов и выполнения вычислений .

Я использую Sun Java 1.6.0.31 в 64-битном дистрибутиве RHEL Linux.

1 Ответ

4 голосов
/ 15 марта 2012

Кроме кучи Java, есть несколько приемников памяти, управляемых -Xmx:

  • Нити стеков
  • Пространство PermGen
  • прямой ByteBuffers и сопоставленный ByteBuffer
  • память, выделенная собственным кодом / библиотеками

Не зная деталей вашей системы, я бы догадался, что что-то использует сопоставленный ByteBuffers.

Но вы можете разобраться в проблеме, изучив вывод команды pmap. В нем перечислены все области памяти процесса вместе с именами файлов, которым сопоставлен любой регион (если, конечно, области отображаются ).

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