Каковы наилучшие настройки сборки мусора на стороне клиента?

В последних версиях JVM имеется множество параметров XX для сборки мусора (см., Например, здесь), но какие варианты могут заставить клиентское приложение Swing действительно работать лучше?

Я должен отметить, что одна из вещей, которая действительно раздражает меня в клиентских Java-приложениях, - это большая задержка в сборке мусора из-за остановки мира. В Intelli-J IDEA я видел, как он шел три минуты или больше.

РЕДАКТИРОВАТЬ: Спасибо за все ответы. Просто чтобы отчитаться, я включил сборщик мусора CMS для IDEA (который является хорошим общим справочным материалом о типе приложения, с которым знакомо большинство читателей этого вопроса), используя настройки, предложенные здесь. Я также установил -XX:+StringCache, чтобы увидеть, уменьшит ли это требования к памяти.

В общем, наблюдение состоит в том, что обычная производительность бега не ухудшается до такой степени, что вы можете заметить, глядя на нее. Снижение объема памяти огромно при использовании параметра String Cache, однако метод CMS не является исчерпывающим и в итоге требует остановки цикла сбора мусора в мире (до трехминутного ожидания), чтобы очистить память (400 МБ за один запуск).

Однако, учитывая уменьшенный объем памяти, я мог бы просто разместить меньший максимальный объем памяти, что позволит остановить мировые коллекции меньшего размера.

IDEA 8.1.4 поставляется с JDK 1.6.0_12, поэтому я еще не тестировал G1. Кроме того, моя машина имеет только 2 ядра, поэтому подход G1 не будет максимально эффективным. Время бить босса за лучшую машину;).

5 ответов

Решение

На этот вопрос нет однозначного ответа, он сильно зависит от того, что делает ваше приложение и как оно управляет своими объектами. Может быть, взгляните на Как работает сборщик мусора и Параллельные и параллельные сборщики мусора, чтобы понять различные варианты.

Затем проверьте документ " Настройка сборки мусора виртуальной машины Java SE 6 HotSpot[tm]", в котором подробно рассматриваются концепции и методы настройки GC для Java SE 6, которые были представлены в разделе " Настройка сборки мусора" с документом виртуальной машины Java 5.0.

Если вы хотите, чтобы паузы для сборки мусора были короткими, параллельный сборщик, вероятно, является правильным направлением, поскольку он выполняет большую часть своей работы одновременно (то есть, пока приложение все еще работает). Но для поиска наилучшей настройки потребуется профилирование (рассмотрите возможность измерения пропускной способности ГХ, максимального и среднего времени паузы, частоты полных ГХ и их продолжительности).

(РЕДАКТИРОВАТЬ: Прочитав комментарий от OP, я думаю, что прочитав Мой совет по настройке кучи JVM, держите пальцы подальше от ручек! От гуру производительности Кирка Пеппердина было бы хорошей идеей.)

Настройка сборки мусора - это больше, чем искусство, а наука, и она действительно зависит от вашего приложения и его использования. Если вас беспокоят стандартные стратегии "останови мир", почему бы не перейти на CMS (одновременную метку и развертку) или новый сборщик G1?

Лучший способ - изменить параметры и подключить профилировщик, чтобы проверить поведение приложения.

Это довольно автоматически и работает для нас:

-server -Xss4096k -Xms12G -Xmx12G -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:GCTimeRatio=19 -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -XX:+PrintGCTaskTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -Xloggc:gc.log

Не существует "лучшего" варианта (если бы он был, кто-нибудь использовал бы его, верно?), Но, возможно, вариант, который поможет в вашем случае. Но вот несколько советов:

  • Используйте последнюю ВМ. Код GC улучшался с каждым выпуском.
  • Использовать клиент jvm.dll (доступно в sinve Java 1.5 в jre/bin/client/). Это должно быть по умолчанию.
  • Выделение и освобождение объектов в Java - это дешево. Держать их дорого.

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

Другие вопросы по тегам