Каковы наилучшие настройки для сборки мусора на стороне клиента? - PullRequest
5 голосов
/ 26 ноября 2009

В последних версиях 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 ]

7 голосов
/ 26 ноября 2009

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

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

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

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

4 голосов
/ 12 апреля 2012

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

-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
4 голосов
/ 26 ноября 2009

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

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

2 голосов
/ 26 ноября 2009

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

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

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

...