2013-03-29 4 views
6

В настоящее время я запускаю приложение, для которого требуется максимальный размер кучи 16 ГБ.Длинные GC-паузы в приложении

В настоящее время я использую следующие флаги для обработки мусора.

-XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=50, -XX\:+DisableExplicitGC, -XX\:+PrintGCDateStamps, -XX\:+PrintGCDetails, -Xloggc\:/home/user/logs/gc.log 

Однако я заметил, что во время некоторых коллекций мусора, замки приложений на несколько секунд, а затем продолжает - Это совершенно неприемлемо, поскольку это игровой сервер.

Приложение из моих журналов сбора мусора можно найти here.

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

+4

Я считаю, что это одна из причин, почему многие люди предпочитают C++ над Java в режиме реального времени игры , Но не принимайте * мое * слово для этого ... – Mysticial

+0

Можете ли вы предоставить некоторые конкретные строки, которые долгое время приостанавливали gc? Вместо того, чтобы ожидать, что читатели будут искать файл журнала для строк – noahlz

+0

, я предпочитаю использовать память кучи для чего-либо более 1 ГБ. Сбой памяти кучи сложнее кодировать, но мало влияет на время паузы GC. –

ответ

4

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

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

Итак ...

  • Попытка уменьшить фактическое использование памяти вашего приложения; например не кэшируя столько материала или уменьшая размер вашего «мира».
  • Попробуйте уменьшить скорость, с которой ваше приложение создает мусор.
  • Переход на машину с большим количеством сердечников, чтобы в случае необходимости было больше ядер для запуска параллельных потоков GC.

Для Mysticial:

Да, задним числом, это могло бы быть лучше реализовать сервер в C++. Однако мы ничего не знаем о «игре». Если это связано с сложной мировой моделью со сложными гетерогенными структурами данных, то ее реализация в C++ может означает, что вы заменяете проблему «GC pause» проблемой, что сервер постоянно сбой из-за проблем с тем, как он управляет его структур данных.

+0

Я не хотел подбрасывать Java. C++ и Java - это просто разные инструменты для разных вещей. – Mysticial

+0

Игра, на которой работает сервер, является «Minecraft», если это вообще помогает. – Gontroller

+3

А ... так в основном, ваш вопрос о том, как настроить Minecraft. Не совсем проблема программирования. Я думаю, вы получите ответы на это в формулах Minecraft. –

0

Какую версию java вы используете? http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html Чтобы лучше попытаться свести к минимуму использование переменных экземпляра в классе. Лучше будет выполнять локальные переменные, чем переменные экземпляра. Это помогает в достижении производительности и безопасности от проблемы синхронизации. В конце работы перед выходом из программы всегда перезагружайте использованные переменные, если вы используете переменные экземпляра и снова устанавливаете их, когда это необходимо. Это помогает больше в повышении производительности. Кроме того, в версии java реализована хорошая политика сбора мусора. Лучше перейти к новой версии, если она безнадежна. Также вы можете отслеживать время паузы в сборщике мусора с помощью VisualVm, и вы можете получить больше информации, когда он выполняет больше сбора мусора.

1

Я не специалист по сборке мусора Java, но похоже, что вы поступаете правильно, используя параллельный сборщик (флаг UseConcMarkSweepGC), предполагая, что сервер имеет несколько процессоров. Следуйте рекомендациям по устранению неполадок на http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms.Если у вас уже есть, сообщите нам, что произошло, когда вы их попробовали.

2

Глядя на ваши журналы, я не вижу длинных пауз. Но молодой ГК очень частый. Темп продвижения очень низкий, хотя (большинство мусора очищается молодым GC, как и должно). В то же время ваше прежнее использование пространства низкое.

Кстати, мы говорим о сервере minecraft?

Чтобы уменьшить частоту молодого GC, вы должны увеличить его размер. Я хотел бы предложить начать с -XX:NewSize=8G -XX:MaxNewSize=8G

Для такого большого пространства молодой, вы должны также уменьшить потери кормильца размер пространства -XX:SurvivorRatio=512

настройка GC является путь проб и ошибок, так что вам, возможно, потребуется еще несколько итераций и настройки.

Вы можете найти несколько полезных статей на мю блоге

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