Вопрос Оптимизация кода для сборщика мусора

Wayfarer

Пользователь
Сообщения
203
Решения
2
К сути, есть алгоритм, ищущий путь к игроку, который должен учитывать расстояния в 48+ блоков радиусом и пока путь ищется, создаются огромная куча короткоживущих объектов (Node), который съедает фибоначчиевая куча для рассчёта эффективного маршрута (а для маленьких расстояний наикратчайшего). Из-за таких приколов и частых вызовов алгоритма (пусть надо перерассчитывать часто из-за динамичного мира, где всё время что взрывается, ставится, ломается (из блоков)) часто работает сборщик мусора, который выносит молодое поколение, по таймингам спарк каждые 6 секунд вызывается при небольшой кучке мобов. Из проведённых оптимизаций: не рассчитывается длинный маршрут для множества мобов в одной зоне (16х16х16), один ищет на 48+ блоков, остальным радиус поиска урезается. Вынес как можно больше проверок до того, как будет создан новый объект, что немного помогло. Собственно, а если мобов будет 100+ на сервере? А если 300+? Я просто знаю, если цифра в таймингах жёлтенькая, значит нехорошо, зелёненькая - хорошо. Это я вижу как бутылочное горлышко моего плагина, как можно это всё оптимизировать? И настолько критично ли?

Для запуска сервера у меня стандартный конфиг с сайта пейпер
Код:
"C:\Program Files\Java\jdk-22.0.1\bin\java.exe" -jar
-Xms6192M -Xmx6192M -XX:+UseG1GC -XX:+ParallelRefProcEnabled
-XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC
-XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40
-XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5
-XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15
-XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5
-XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1
-Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true paper.jar

pause
 
Ну так не создавай - делов-то.
Грамотное управление памятью и навыки писать без-аллокационный код - целое искусство, которое очень дорого оплачивается в современном мире, и чтобы его отточить уйдет не 1 год. Собственно - это мое приоритетное рабочее направление

Собственно, 1 из причин, почему у меня ES работает очень быстро - потому-что практически весь критический код переписан на "ручное" и более эффективное управление памятью
offtop
В чём смысл оффтопа, я за тебя рад, и за твою очередную рекламу ЕС, а по теме?
 
Последнее редактирование:
Ответил первой же строкой.
Мой ответ полностью по теме, сожалею, что масленки вроде тебя не умеют читать и им приходится все разжевывать

Переписывай свой код так, чтобы не порождать мусора
Так, как бы ты его стал писать например на том же С, который база
И? В чём смысл ответа? Не делать если не умеешь? Отличный совет (нет). Всё что ты делаешь в большинстве своих сообщениях, это реклама эльки и своих услуг (срёшь оффтопом). На спигот форуме фордж сервера на доисторическую версию. А на свою элкьу ты фалломорфируешь наверное сколько я себя помню на этом форуме, ты даже в чате не забыл упомянуть, буквально вчера. Я рад за тебя (нет), но такие как ты непробиваемые челибаны с раздутым ЭГО, которые любят называть таких как я маслятами, так что кышь с темы, не вижу смысла отвечать на дальнейшия сообщения (высеры)
 
К сути, есть алгоритм, ищущий путь к игроку, который должен учитывать расстояния в 48+ блоков радиусом и пока путь ищется, создаются огромная куча короткоживущих объектов (Node), который съедает фибоначчиевая куча для рассчёта эффективного маршрута (а для маленьких расстояний наикратчайшего). Из-за таких приколов и частых вызовов алгоритма (пусть надо перерассчитывать часто из-за динамичного мира, где всё время что взрывается, ставится, ломается (из блоков)) часто работает сборщик мусора, который выносит молодое поколение, по таймингам спарк каждые 6 секунд вызывается при небольшой кучке мобов. Из проведённых оптимизаций: не рассчитывается длинный маршрут для множества мобов в одной зоне (16х16х16), один ищет на 48+ блоков, остальным радиус поиска урезается. Вынес как можно больше проверок до того, как будет создан новый объект, что немного помогло. Собственно, а если мобов будет 100+ на сервере? А если 300+? Я просто знаю, если цифра в таймингах жёлтенькая, значит нехорошо, зелёненькая - хорошо. Это я вижу как бутылочное горлышко моего плагина, как можно это всё оптимизировать? И настолько критично ли?

Для запуска сервера у меня стандартный конфиг с сайта пейпер
Код:
"C:\Program Files\Java\jdk-22.0.1\bin\java.exe" -jar
-Xms6192M -Xmx6192M -XX:+UseG1GC -XX:+ParallelRefProcEnabled
-XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC
-XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40
-XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5
-XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15
-XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5
-XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1
-Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true paper.jar

pause
А при чём тут сборщик мусора
 
А при чём тут сборщик мусора
Посчитал, что сборщик мусора тоже имеет значение, при правильной настройке можно минимизировать кол-во проблем, либо, если это не имеет большого значения, есть другие способы, примеры..?
При малом кол-ве мобов всё работает стабильно. Я думал насчёт кэширования чанков, но они слишком часто меняются и всё равно нужно обратно получать чанкснапшот и опять идём к тому, что нужно вызывать кучу объектов
 
Посчитал, что сборщик мусора тоже имеет значение, при правильной настройке можно минимизировать кол-во проблем, либо, если это не имеет большого значения, есть другие способы, примеры..?
Не понял ничего из этого
Нет серьёзно, чуть конкретнее...
 
Не понял ничего из этого
Нет серьёзно, чуть конкретнее...
Ладно, попробую чуть подробнее. В общем, на каждого моба в мире создаётся свой поисковик путей
Где оттуда вычисляется маршрут, скармливается мобу в виде массива и он по нему ходит, удаляя первую точку из массива как дойдёт до неё. При этом каждые n времени идёт перерасчёт маршрута (лучше конечно сделать перепроверку маршрута при изменений блоков на маршруте, но это позже, проблема не в этом)
Сам алгоритм ходьбы немного кривой, но это лучше, чем был месяц назад.
Поиск путей сделал на основе стыренной либы и форкнутой, которую на спиготорге нашёл.
В самом поиске путей, создаётся узел (Node) который хранит в себе стартовые координаты, конечные, текущие, стоиомость путей и дополнительную инфу (например, если потребуется прыжок). В случае, если до игрока нет пути, то моб проверяет все возможные маршруты пока не закончится итерация, а это уже может быть от настроек до 1-3т за раз. Мне нравится идея, что моб может дойти до игрока используя самые вычурные маршруты, тем самым создавая опасность, поэтому от этой идеи отказаться не могу. И сборщик мусора чаще всего вызывается только тогда, когда до игрока нет маршрута и алгоритм пытается до последнего найти путь до игрока. И это я чувствую, что может стать проблемой при огромной толпе мобов
 
И сборщик мусора чаще всего вызывается только тогда, когда до игрока нет маршрута и алгоритм пытается до последнего найти путь до игрока. И это я чувствую, что может стать проблемой при огромной толпе мобов
Но ведь....
Это не совсем так работает...
Он срабатывает просто когда ему нужно...
А потому это не проблема...

И вообще опять же в таком случае причем тут сборщик...
Просто выделяем больше памяти и радуемся...
 
Но ведь....
Это не совсем так работает...
Он срабатывает просто когда ему нужно...
А потому это не проблема...

И вообще опять же в таком случае причем тут сборщик...
Просто выделяем больше памяти и радуемся...
Огромная толпа, создающая огромную кучу короткоживущих объектов, заставляя сборщик собирать мусор каждую секунду (или даже меньше), не будет большой проблемой? Я не тестировал прям в совсем хардкорных условиях
 
Огромная толпа, создающая огромную кучу короткоживущих объектов, заставляя сборщик собирать мусор каждую секунду (или даже меньше), не будет большой проблемой? Я не тестировал прям в совсем хардкорных условиях
Ну если выделить тупо больше памяти - проблемы не должно быть)
А вообще /start profiler alloc думаю замерить неплохо было бы для понимания
 
Раз тут алгоритм, который ищет путь от одной точки к другой, ты пробовал найти готовые реализации этого алгоритма, которые, возможно, были бы более эффективны?

Например, я рекомендую эту реализацию A*, которая подходит для любого 3d пространства, включая майнкрафт:

Когда есть ограничения по памяти, насколько я понимаю, предпочтительнее использовать IDA*. Его реализации на жаве гораздо менее популярны, но готовые явно существуют, например,
Объединено

Но ведь....
Это не совсем так работает...
Он срабатывает просто когда ему нужно...
А потому это не проблема...

И вообще опять же в таком случае причем тут сборщик...
Просто выделяем больше памяти и радуемся...
Это не совсем так и мысли автора оправданы, вызов сборщика не бесплатный. Если ты создаёшь много временных объектов, их всех придётся удалять. На это расходуется процессорное время, а некоторые сборщики (например, g1), и вовсе блокируют весь процесс на момент очистки. Так что нельзя просто накидать сборщику кучу работы и думать, что оно само как-то рассосётся
 
Последнее редактирование:
Назад
Сверху Снизу