2014-01-18 7 views
1

Этот вопрос дубликат Is it possible to change the priority of garbage Collector thread?Как изменить приоритет потока коллекции мусора?

Это старый вопрос, и с тех пор ситуация может сильно измениться. И он не проясняет все.

Можно ли изменить приоритет потока GC? Я видел потоки дампов с разным приоритетом потока GC. Как это происходит, если мы не можем его изменить? Кроме того, я понимаю, что высокочастотные торговые платформы хотят сохранить приоритет потока GC очень низким, чтобы основные потоки выполнялись большую часть времени, а событие «Остановить мир» не происходит очень часто.

ответ

1

Короткий ответ: приоритеты нитей не могут использоваться для предотвращения помех ГХ с приложениями.

Длинный ответ:

Резьбовые приоритеты Java не соблюдаются в JVM и основной ОС. Это хорошо известная проблема, которая была рассмотрена, например, по RTSJ.

Java нить приоритетные требования являются:

  • специально разработан VM, который поддерживает Java приоритеты и
  • реального времени OS.

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

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

Наконец, основные методы для высокой торговой частоты или избежать GC стоп-на-мир делает паузу в целом тщательный настройка GC и выбрать правильный алгоритм GC - оба из них может быть сделано в comodity VM (например HotspotVM).

2

Можно ли изменить приоритет потока GC?

Я действительно считаю, что это Неправильный вопрос. Вы не хотите влиять на приоритет такой критической фоновой операции. Это может, в зависимости от архитектуры потока, голодать поток GC и сбивать JVM.

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

Есть много способов, чтобы уменьшить пропускную способность объекта:

  • меняющийся использовать изменяемые объекты при необходимости (т.е. там, где объекты не разделяются между потоками)
  • очистка и повторное использование коллекции в отличие от реконструкции их
  • использованием StringBuilder в отличие от серийного String присоединяет
  • использованием SLF4J типа {} каротажа
  • , возможно, с помощью ThreadLocal для хранения состояния объектов, которые могут быть сброшены и повторно
  • и т.д ..

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

См. Комментарий к @ Voo ниже, чтобы получить хорошее предостережение.

+2

Лучше быть очень осторожным, если «оптимизировать» в этой области. Один пример: недолговечные небольшие объекты - это то, с чем настроен GC, поэтому введение пулов объектов для повторного использования объектов часто может привести к ухудшению производительности (особенно задержка) по дорогам на современных JVM. Молодые генералы GC действительно дешевы! – Voo

+0

Несколько согласен @Voo. Я не уверен, что использование пулов объектов никогда не приводит к ухудшению производительности (если оно не выполняется плохо или требует блокировок синхронизации или что-то в этом роде), но это может означать гораздо больше кода без улучшения производительности. – Gray

+0

Спасибо. В этом случае причина, по которой мы имеем разные приоритеты для потоков GC в дампе потока, состоит в том, что JVM решил поместить разные приоритеты для разных приложений? –

Смежные вопросы