Сокращение времени паузы JVM> 1 второе использование UseConcMarkSweepGC

Проблема заключалась в том, что я запускал командный файл не из локальной папки, а через само приглашение cmd.

10
задан Ravindra babu 10 December 2015 в 05:02
поделиться

7 ответов

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

Я разрешил это путем устанавливания "swappiness" параметра Linux на 0 (так, чтобы он не выгружал данные к диску).

6
ответ дан 3 December 2019 в 15:07
поделиться

Во-первых, проверьте Java SE 6 HotSpot [TM] Настраивающая документация Сборки "мусора" Виртуальной машины, если Вы уже не сделали так. В этой документации говорится:

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

и немного позже...

Параллельный коллектор приостанавливает приложение дважды во время параллельного цикла сбора.

Я замечаю, что те GCs, кажется, не освобождают особую память. Возможно, многие Ваши объекты долговечны? Можно хотеть настроить размеры поколения и другие параметры GC. 10 ГБ являются огромной "кучей" по многим стандартам, и я наивно ожидал бы, что GC займет больше времени с такой огромной "кучей". Однако, 1 секунда является очень долгим временем паузы и указывает, что или что-то неправильно (Ваша программа генерирует большое количество ненужных объектов или генерирует трудно исправляемые объекты или что-то еще), или просто необходимо настроить GC.

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

Как другие сказали, необходимо представить приложение для наблюдения, где узкое место. Действительно ли Ваш PermGen является слишком крупным для места, выделенного к нему? Вы создаете лишние объекты? jconsole работает, чтобы, по крайней мере, показать минимум информации о VM. Это - начальная точка. Как другие указали однако, Вам очень вероятно нужны более усовершенствованные инструменты, чем это.

Удачи.

11
ответ дан 3 December 2019 в 15:07
поделиться

Так как Вы упоминаете свое требование кэшироваться, я предполагаю, что большая часть Вашей огромной "кучи" занята тем кэшем. Вы могли бы хотеть ограничить размер кэша так, чтобы Вы были уверены, что он никогда не пытается стать достаточно большим для заполнения штатного поколения. Не полагаться SoftReference один для ограничения размера. Поскольку старое поколение заполняется мягкими ссылками, более старые ссылки будут очищены и становиться мусором. Новые ссылки (возможно, к той же информации) будут созданы, но очищены быстро, потому что свободное пространство в дефиците. В конечном счете штатное пространство полно мусора и должно быть убрано.

Рассмотрите корректировку -XX:NewRatio установка также. Значение по умолчанию 1:2, означая, что одна треть "кучи" выделяется новому поколению. Для большой "кучи" это почти всегда слишком много. Вы могли бы хотеть попробовать что-то как 9, который сохранит 9 Гбит Вашей "кучи" на 10 Гбит для старого поколения.

11
ответ дан 3 December 2019 в 15:07
поделиться

Вот некоторые вещи, которые я нашел, который мог быть значительным.

  • JSON-RPC может генерировать много объектов. Не так как XML-RPC, но тем не менее что-то для наблюдения за. В любом случае Вы, действительно кажется, генерируете столько же на уровне 100 МБ объектов в секунду, что означает, что Ваш GC выполняет высокий процент времени и, вероятно, будет добавлять к Вашей случайной задержке. Даже при том, что GC параллелен, Ваши аппаратные средства/ОС, очень вероятно, покажут неидеальную случайную задержку при загрузке.
  • Взгляните на свою архитектуру сегмента памяти. На Linux команда является numactl - аппаратные средства. Если Ваш VM будет разделен больше чем через один сегмент памяти, то это значительно увеличит Ваши времена GC. (Это также замедлит Ваше приложение, поскольку эти доступы могут быть значительно менее эффективными), Чем тяжелее Вы работаете подсистема памяти, тем более вероятно ОС должна будет сместить память вокруг (Часто в большом количестве), и Вы получаете поразительные паузы в результате (100 мс не удивительно). Не забывайте, что Ваша ОС действительно больше, чем просто запускает Ваше приложение.
  • Рассмотрите уплотнение/сокращение потребления памяти Вашего кэша. При использовании нескольких ГБ кэша, стоит посмотреть на способы сократить потребление памяти далее, чем Вы уже имеете.
  • Я предлагаю, чтобы Вы представили свое приложение с трассировкой выделения памяти И выборкой CPU на одновременно. Это может привести к совсем другим результатам и часто указывает на причину подобных проблем.

Используя эти подходы, задержка вызова RPC может быть уменьшена до ниже с 200 микросекундами, и времена GC уменьшили до 1-3 мс, производящих меньше, чем 1/300 вызовов.

2
ответ дан 3 December 2019 в 15:07
поделиться

Я также предложил бы GCViewer и профилировщика.

0
ответ дан 3 December 2019 в 15:07
поделиться

Некоторые места, чтобы начать смотреть:

Также я выполнил код через профилировщика.. Мне нравится тот в NetBeans, но также существуют другие. Можно просмотреть поведение gc в режиме реального времени. Визуальный VM делает это также..., но я еще не выполнил его (поиск причины для..., но еще не имели времени или потребности).

0
ответ дан 3 December 2019 в 15:07
поделиться

Несколько вещей, что я надеюсь, могут помочь:

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

Ваш Кэш Мягких Ссылок является чем-то вроде опасной идеи для Коллекторов Поколений и является, вероятно, одной причиной почему Ваши молодые наборы поколения arn't собирающий слишком много мусора.

Если я не ошибусь, неважно, насколько недолгий Объект, если он будет помещен в кэш (который наверняка превратил его в Штатное Поколение), то это будет живо, пока FullGC не произойдет, даже если никакие другие ссылки на него не существуют!

То, что это означает, является Вашими объектами, которые живут в молодом генерале, которые помещаются в кэш, теперь копируются многократно, поддерживаются, поддерживая их ссылки, и обычно замедляя youngGen GC.

Его довольно парадоксальное, как кэширование может уменьшить объектное выделение, но увеличить время GC.

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

0
ответ дан 3 December 2019 в 15:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: