Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Фризит майнкрафт при резком сбросе озу

Дмитрий Фасхутдинов Знаток (454), закрыт 3 года назад
Когда играю в Майн, зависает игра резко на пару секунд, заметил что проблема связанна с тем, когда озу накапливается очень много, майн её сбрасывает и в этот момент происходит фриз на пару секунд, раньше была такая же проблема, но решалась уменьшение количества озу для майна, сейчас это не помогает
Лучший ответ
АІ (Александръ Івановъ) Просветленный (41774) 3 года назад
Действительно, такая проблема есть. Заключается она в срабатывании так называемого "сборщика мусора". Чтобы понять, что это такое, и как бороться с этой проблемой, надо разобраться с тем, как работает сборщик.

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

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

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

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

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

Путей решения несколько:
• Покупка более быстрой оперативки
Чем быстрее скорость чтения-записи, тем быстрее программа и сборщик мусора может с ней взаимодействовать.
• Баланс между объёмом выделенной ОЗУ и временем зависаний
Просто попробуйте уменьшить количество выделенной памяти.
• Запуск игры с Java 16
В новых версиях Java сборщики мусора работают гораздо быстрее, поэтому зачастую достаточно просто запустить игру на Java 16.
• Подбор более эффективного сборщика мусора
Это оптимальный вариант, так как алгоритмов сборки мусора существует несколько. Вот самые популярные:
▶ G1 – Стандартный сборщик мусора, очищает память довольно часто, но лишь небольшими порциями. Это позволяет игре не зависать, однако при быстром накоплении мусора G1 может не справиться.
▶ Shenandoah – Эффективно очищает всю память при заполнении ≈80% выделенного объёма, не вызывая пролаги. Сам пользуюсь им.
▶ ConcMarkSweep – Использует многопоточный алгоритм очистки, благодаря чему скорость чистки оперативной памяти кратно повышается.

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


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


Конечно, я очень сильно упростил этот материал. Если вы хотите разобраться в этом более подробно, можно ознакомиться с этой статьёй.
АІ (Александръ Івановъ)Просветленный (41774) 3 года назад
Пара слов о сборщиках мусора. Каждый из них обладает своим "поведением" и подходом к работе с ОЗУ. Постараюсь дать ссылки на каждый сборщик по отдельности. Общая статья по сборщикам и их параметрам: [Доступные сборщики мусора в Java
]


[G1] (аргументы по умолчанию)
-Xmx3G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M
Здравствуйте, я перепробовал все способы, всё равно при падении значения используемой оперативки ко всей провисает майнкрафт, что делать? можете помочь как-то?
АІ (Александръ Івановъ)Просветленный (41774) 3 года назад
Статьи по G1GC: [тык]

[Shenandoah]
-Xmx4G -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:MaxGCPauseMillis=50

[ConcMarkSweep] (Не работает в Java 16)
-Xmx4G -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:-UseAdaptiveSizePolicy -Xmn128M

[Z]
Важно: при малом объёме выделенной ОЗУ (2Гб) сборщик не справлялся со своей задачей, вызывая ежесекундные зависания игры.
-Xmx4G -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
Можно добавить -XX:ConcGCThreads=4 (количество процессов для сбора мусора)
Александр Иванов, красавчик, всё хорошо расписал, мне очень понравилось, но у меня краш при любых аргументах( Не знаешь в чём дело? Вылезает Error: Could not create the Java Virtual Machine. Error: Afatal exception has occurred. Program will exit.
Михаил МихинУченик (106) 2 года назад
Чтобы сборщик мусора Shenandoah работал на 1.12.2, нужно скачать версию java 8 с сайта RedHat - https://developers.redhat.com/products/openjdk/download
Затем, в лаунчере указать путь к этой джаве и такие параметры запуска:
-Xmx4G -Xms4G -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+AlwaysPreTouch -XX:+DisableExplicitGC
---
Для TLauncher должно быть так:
АІ (Александръ Івановъ) Просветленный (41774) Михаил Михин, на TL ничего настраивать не нужно, он уже использует наиболее подходящие для системы аргументы. А с тем фейком, что стоит у тебя, лучше вообще ничего не настраивать, а сразу систему сносить, чтобы его вирусню вычистить.
Остальные ответы
Похожие вопросы