Какой размер кучи вы предпочитаете? - PullRequest
1 голос
/ 17 сентября 2008

Я знаю, что нет «правильного» размера кучи, но какой размер кучи вы используете в своих приложениях (тип приложения, jdk, os)?

Опции JVM -Xms (начальный / минимальный) и -Xmx (максимальный) позволяют контролировать размер кучи. Какие настройки имеют смысл при каких обстоятельствах? Когда подходят значения по умолчанию?

Ответы [ 8 ]

5 голосов
/ 17 сентября 2008

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

Первым делом я увеличил кучу до 1 гига. это избавило от проблем с нехваткой памяти, но это было все еще медленно. Я также заметил, что IDEA регулярно зависала в течение 10 секунд или около того, после чего использованная память была разрезана пополам только для повторного увеличения, и это вызвало идею сбора мусора. Теперь я использую его с -Xms512m, -Xmx768m, но я также добавил -Xincgc, чтобы активировать пошаговую сборку мусора

В результате я получил мою старую IDEA: она работает гладко, больше не зависает и никогда не использует более 600 м кучи.

Для вашего приложения вы должны использовать аналогичный подход. попытайтесь определить типичное использование памяти и настройте кучу, чтобы приложение хорошо работало в этих условиях. Но и пусть опытные пользователи настроят настройку, чтобы справиться с обычными нагрузками данных.

3 голосов
/ 17 сентября 2008

Это зависит от типа приложения. Настольное приложение сильно отличается от веб-приложения. Сервер приложений сильно отличается от отдельного приложения.

Это также зависит от используемой вами JVM. JDK5 и более поздние версии 6 содержат улучшения, помогающие понять, как настроить приложение.

Размер кучи важен, но также важно знать, как он работает с сборщиком мусора.

JDK1.4 Настройка сборщика мусора

JDK5 Настройка сборщика мусора

JDK6 Настройка сборщика мусора

2 голосов
/ 17 сентября 2008

На самом деле я всегда считал очень странным, что Java ограничивает размер кучи. Нативное приложение обычно может использовать столько кучи, сколько ему нужно, пока оно не исчерпает виртуальное адресное пространство. Единственная причина ограничить кучу в Java - сборщик мусора, который имеет определенный тип «лени» и может не собирать мусор, если в этом нет необходимости. Это означает, что если вы выберете кучу слишком большой, ваше приложение будет постоянно использовать больше памяти, чем действительно необходимо.

Однако Sun значительно улучшила GC за эти годы, и для эмуляции поведения нативного приложения на C я бы установил начальный размер кучи 32 МБ (для небольших программ) или 64 МБ (для более крупных) и максимум что-то между 1-2 ГБ. Если вашему приложению действительно требуется более 1 ГБ памяти, оно, скорее всего, повреждено (если вы не имеете дело с такими большими объектами данных), но я не вижу причин, по которым ваше приложение должно быть уничтожено, просто потому, что оно превышает определенный размер кучи.

Конечно, это относится к обычным ПК. Если вы создаете код Java для мобильных телефонов или других ограниченных устройств, вам, вероятно, следует принять начальный и максимальный размер кучи к ограничениям этого устройства.

1 голос
/ 02 октября 2009

В моем самом ресурсоемком приложении:

-Xms250M -Xmx1500M -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC 
1 голос
/ 02 октября 2009

1,3 Гб для тяжелого графического приложения.

К сожалению, в Linux JVM, по-видимому, предварительно запрашивает 1,3 ГБ виртуальной памяти в этой ситуации, что выглядит плохо, даже если она не нужна (и вызывает много путаницы у пользователей)

1 голос
/ 17 сентября 2008

Вам нужно потратить довольно много времени в JConsole или visualvm, чтобы получить четкое представление об использовании памяти плато. Подождите, пока все не станет стабильным, и вы увидите характерную пилообразную кривую использования кучи памяти. Пики должны составлять вашу кучу на 70-80%, в зависимости от того, какой сборщик мусора вы используете.

Большинство сборщиков мусора запускают полные сборщики мусора, когда использование кучи достигает определенного процента. Этот процент составляет от 60% до 80% от максимальной кучи, в зависимости от используемой стратегии.

1 голос
/ 17 сентября 2008

Это полностью зависит от вашего приложения и возможных аппаратных ограничений. Не существует единого размера для всех.

jmap можно использовать для просмотра того, какую кучу вы на самом деле используете, и это хорошая отправная точка для правильного определения размера кучи.

1 голос
/ 17 сентября 2008

Обычно я стараюсь не использовать кучи размером более 1 ГБ. Это будет стоить вам на крупных сборках мусора.

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

Основная коллекция с большим размером кучи может занять> 10 минут (в неоптимизированных приложениях GC).

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