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

StackOverflow https://stackoverflow.com/questions/1804186

Вопрос

Последние 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 на самом деле не будет максимальным.Пришло время обратиться к боссу за машиной получше ;).

Это было полезно?

Решение

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

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

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

(РЕДАКТИРОВАТЬ: прочитав комментарий от ОП, я думаю, что читая мой совет по куче 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 (доступен в версии Java 1.5 в jre/bin/client/).Это должно быть значение по умолчанию.
  • Выделение и освобождение объектов в Java обходится дешево.Содержать их при себе дорого.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top