Ответы Mail.ru: Фризит майнкрафт при резком сбросе озу

Действительно, такая проблема есть. Заключается она в срабатывании так называемого "сборщика мусора". Чтобы понять, что это такое, и как бороться с этой проблемой, надо разобраться с тем, как работает сборщик.

Чтобы процессору обработать какие-то данные, их сначала надо загрузить в оперативную память. В процессе вычислений процессор по частям подгружает эти данные в свой кэш, а затем возвращает результат в ту же оперативную память. При этом, старые данные никуда не деваются и продолжают храниться в ОЗУ. Отсюда появляется рост занимаемой игрой памяти с течением времени, который можно наблюдать в меню отладки, или более наглядно при помощи мода

Memory Usage Screen

.

Когда количество занятой оперативной памяти достигает определённого предела, срабатывает сборщик мусора. Это алгоритм, который отличает старые хранящиеся в ОЗУ отработавшие данные от необходимых программе в данный момент и производит их удаление. Этот процесс всегда характеризуется полной остановкой всех вычислений, из-за чего игра и зависает.

Интересно, что чем меньше выделен объём ОЗУ, тем быстрее он забивается остатками вычислений (входными данными для процессора), однако при низких значениях выделенной памяти ͟п͟р͟о͟л͟а͟г͟а͟ ͟н͟е͟ ͟п͟р͟о͟и͟с͟х͟о͟д͟и͟т.

Почему же? Дело в том, что чем меньше ОЗУ выделено для JVM, тем быстрее сборщик мусора его обрабатывает. То есть, сборщик мусора работает ͟ч͟а͟щ͟е͟,͟ ͟н͟о͟ ͟б͟ы͟с͟т͟р͟е͟е. При больших же значениях выделенной памяти сборщик мусора обрабатывает весь объём ОЗУ редко, но долго, создавая характерное зависание.

Именно поэтому нужно соблюсти идеальный баланс между выделенной ОЗУ и временем его чистки. Но важно помнить, что когда ОЗУ выделено настолько мало, что Майнкрафт не может просчитать тик сервера без очистки мусора, игра начинает сильно виснуть и вылетает.

͟Ч͟т͟о͟ ͟с͟ ͟э͟т͟и͟м͟ ͟д͟е͟л͟а͟т͟ь͟?

Путей решения несколько:

• Покупка более быстрой оперативки

Чем быстрее скорость чтения-записи, тем быстрее программа и сборщик мусора может с ней взаимодействовать.

• Баланс между объёмом выделенной ОЗУ и временем зависаний

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

• Запуск игры с Java 16

В новых версиях Java сборщики мусора работают гораздо быстрее, поэтому зачастую достаточно просто

запустить игру на Java 16

.

• Подбор более эффективного сборщика мусора

Это оптимальный вариант, так как алгоритмов сборки мусора существует несколько. Вот самые популярные:

▶ G1 – Стандартный сборщик мусора, очищает память довольно часто, но лишь небольшими порциями. Это позволяет игре не зависать, однако при быстром накоплении мусора G1 может не справиться.

▶ Shenandoah – Эффективно очищает всю память при заполнении ≈80% выделенного объёма, не вызывая пролаги. Сам пользуюсь им.

▶ ConcMarkSweep – Использует многопоточный алгоритм очистки, благодаря чему скорость чистки оперативной памяти кратно повышается.

Настройка запуска игры с определённым сборщиком мусора довольно проста – нужно лишь указать его в параметрах запуска JVM (примеры параметров JVM в комментариях). В официальном лаунчере это делается здесь:

А TLauncher Legacy и так по умолчанию использует ConcMarkSweepGC, нужно просто удостовериться, что в настройках стоит эта галочка:

Конечно, я очень сильно упростил этот материал. Если вы хотите разобраться в этом более подробно, можно ознакомиться с

этой

статьёй.