Я запускаю приложение Java с максимальным размером кучи 128 МБ (-Xmx128M). Он работает до успешного завершения без OutOfMemoryError или любого другого необработанного исключения. Поэтому я предполагаю, что его фактический размер кучи остался в пределах заявленного предела в 128 МБ.
Однако, наблюдая за процессом для этого Java-приложения, я вижу пиковое общее использование памяти в размере 4 188 548 КБ (~ 4 ГБ). Это рост более чем в 30 раз превышает контролируемый максимальный размер кучи. Хотя я понимаю, что это значение включает в себя выделенную виртуальную память, которая может быть значительно больше, чем фактическая используемая физическая память, она влияет на жесткие ограничения, такие как ограничения, установленные Sun Grid Engine, и, следовательно, имеет смысл.
Как именно это возможно? Я понимаю, что общая память, используемая JVM, включает в себя немного больше, чем размер кучи, но я не понимаю, как ему может потребоваться несколько ГБ дополнительной памяти, помимо того, что приложение фактически нуждается для создания своих объектов и выполнения вычислений .
Я использую Sun Java 1.6.0.31 в 64-битном дистрибутиве RHEL Linux.