2013-12-18 3 views
4

У меня есть Tomcat с настроенным XMS=XMX (4G оба).Как Java использует память XMX и XMS?

Но - что, если я установлю XMS, например, 1G?

Как я понял - JVM начнет Tomcat с предоставленной 1G памяти. Затем, если приложение требует больше - JVM поднимет его до 4G за некоторый период. Поднять его - Java должен выполнить некоторые действия (изменить размер, переместить страницы в память?) - и это займет некоторое время и ресурсы ЦП, правильно?

Что произошло после Приложение Tomcat не нуждается в такой большой памяти? Java снова запускает действия для уменьшения используемой памяти?

Спасибо.

P.S. Почему я спрашиваю - с XMS=1G и XMX=4GApache Jmeter дают результаты, которые намного меньше (Throughput и Average), чем если бы я начал Tomcat с XMX и XMS и 4G.

+0

Возможный дубликат [Какие параметры Xms и Xmx при запуске JVM?] (Http://stackoverflow.com/questions/14763079/what-are-the-xms-and-xmx-parameters-when-starting- jvms) – dotancohen

ответ

2

Да, JVM должен выделить больше памяти и переустановить все пространства кучи (Eden, from, to, old и PermGen), чтобы вписаться в новую память. Если вы планируете использовать ваш webapp определенное количество кучи пространства, то вам лучше с максимальной отдачей выделить всю кучу.

JVM никогда не выпустит память, полученную от ОС, как только это будет сделано. Итак, если вам нужна куча 4GiB, и JVM в конечном итоге ее берет, ваша куча останется на уровне 4GiB до тех пор, пока JVM не будет прервана.

+0

Я слышал слухи о том, что новый сборщик мусора G1 («мусор-первый») может вернуть память в ОС, но я не смог найти документально нигде. Работа, требуемая для изменения размера кучи, настолько велика, что я думаю, что в целом можно избежать уменьшения размера всей кучи. Если вы не хотите, чтобы ваш процесс JVM занимал больше Х объема памяти, просто не разрешайте его в первую очередь;) –

1

При установке Xms и Xmx равными значениям JVM не придется изменять размер кучи и избегать времени, которое JVM потратит на это. Это даст лучшие результаты в вашем случае, поскольку с помощью Jmeter вы подчеркиваете сервер, которому нужно будет увеличить кучу. После того как вы финишируете с Jmeter, ваш Tomcat уменьшит кучу после некоторых действий коллекционера мусора, которые уничтожат единичные объекты.

Смежные вопросы