Post

На заметку: Java 21 + сборщик мусора ZGC вместо G1GC. Жор оперативы сервера Minecraft 1.20.1 с 208 модами (включая тяжелые GregTech, Ad Astra, TerraFirmaCraft, Create + аддоны) упал с 10 ГБ до 1.72 ГБ с одним игроком и около 2.8 ГБ если этот один игрок начнет бешено грузить/генерировать чанки.

Для технически грамотных людей: Да, я в курсе, что при использовании G1GC эти 10 ГБ оперативы (-Xmx10G) не жрутся сразу, а просто резервируются. Как я поняла, суть в том, что ZGC эффективнее утилизирует мусорные объекты в памяти, а потому отпадает необходимость резервировать огромные куски памяти

0 reposts2 likes

а, еще -XX:ZUncommitDelay=? задает время через которое память вернется ОС. ценой всех этих настроек является частота и время пауз для сборки, так что их нужно подбирать по ситуации

там дело не в эффективности, просто сборщики мусора в java в основном стремятся не снизить потреблениие памяти (для этого есть xmx), а использовать весь объем но уменьшить или перераспределить задержки при сборке, zgc же старается начать сборку мусора пораньше, чтобы не делать ее под нагрузкой

чтобы еще уменьшить расход память можешь прописать: -XX:SoftMaxHeapSize=?g (где ? количество памяти на котором сборщик будет стараться начать сборку (он будет все равно старатся не делать ее во время больших аллокаций чтобы не вызывать лаг)), и -XX:ZCollectionInterval=? (макс время между сборками)

Обязательно попробую. Пока что у меня аргументы запуска сервера такие: -Xms8G -Xmx10G --add-modules=jdk.incubator.vector -XX:+UseZGC -XX:+UnlockExperimentalVMOptions -XX:ZAllocationSpikeTolerance=5 -XX:+AlwaysPreTouch

Да, спасибо за подробное описание. Насколько я знаю, суть ZGC в том, что он чистит объекты в памяти сразу, как они освобождаются, а не ждет, когда накопится "критическое" количество объектов, чтобы разом вычистить, как делает G1GC, ну и, собственно, JVM не резервирует сразу кучу памяти заранее.