Project Zomboid Руководство

Оптимизация памяти сервера Project Zomboid: JVM, сборщик мусора и лаги

Оптимизация оперативной памяти сервера Project Zomboid: расчёт RAM под онлайн и моды, настройка флагов -Xms/-Xmx и тюнинг сборщика мусора G1GC.

Оптимизация памяти сервера Project Zomboid: JVM, сборщик мусора и лаги

Выделенный сервер Project Zomboid работает на виртуальной машине Java (OpenJDK 17). В процессе длительной работы сервера, особенно при исследовании карты на быстрых автомобилях, генерации тысяч зомби и подключении десятков модов, серверная часть начинает испытывать микрофризы и резкие скачки потребления оперативной памяти. Без тонкой настройки параметров JVM сервер либо упирается в паузы сборщика мусора (Stop-The-World), либо уничтожается механизмом Linux OOM-killer.

В этом практическом руководстве подробно разбирается расчёт необходимой памяти для сервера Project Zomboid, настройка параметров -Xms и -Xmx, оптимизация сборщика мусора G1GC и мониторинг кучи Java.

Расчёт необходимого объёма RAM для мультиплеера#

Для стабильной работы сервера Project Zomboid требуется корректное разделение памяти между Java Heap (кучей) и системными процессами Linux.

Базовая формула расчёта:

  • Базовый минимум для пустого мира: 4 ГБ RAM (загрузка карты Нокс, метаданных комнат и спавна зомби).
  • Запас на каждого одновременного игрока: +500 МБ RAM (отслеживание инвентаря, радиуса видимости и сетевых пакетов).
  • Пакеты модов (Workshop): +2–4 ГБ RAM в зависимости от количества кастомных автомобилей, оружия и дополнительных карт.
  • Резерв операционной системы: минимум 2 ГБ нераспределённой памяти для дискового кэша Linux, сетевых буферов и нативных библиотек C++ движка.

Если физический сервер имеет 16 ГБ RAM, максимальный размер кучи -Xmx следует ограничить значением 12G или 13G. Выделение всех 16 ГБ под Java приведёт к аварийному завершению процесса операционной системой.

Настройка параметров -Xms и -Xmx в start-server.sh#

Конфигурация параметров JVM задаётся в файле запуска ProjectZomboid64.json или в шелл-скрипте start-server.sh. Откройте файл параметров запуска:

bash
nano /opt/pzserver/ProjectZomboid64.json

Установите одинаковые значения начального (-Xms) и максимального (-Xmx) размера кучи, чтобы исключить динамическое расширение памяти во время игры:

json
{
  "mainClass": "zombie/network/GameServer",
  "classpath": [
    "."
  ],
  "vmArgs": [
    "-Xms12G",
    "-Xmx12G",
    "-XX:+UseG1GC",
    "-XX:MaxGCPauseMillis=20",
    "-XX:InitiatingHeapOccupancyPercent=45",
    "-XX:G1ReservePercent=15",
    "-Djava.awt.headless=true"
  ]
}

Если сервер запускается через системную службу systemd, проверьте файл /etc/systemd/system/zomboid.service и убедитесь, что лимит памяти в MemoryMax соответствует параметрам JVM:

ini
[Service]
MemoryMax=14G
LimitNOFILE=65535

Примените изменения службы:

bash
sudo systemctl daemon-reload
sudo systemctl restart zomboid

При использовании специализированной панели управления серверами выделение памяти и тюнинг флагов сборщика мусора настраиваются через удобный слайдер ресурсов с автоматической защитой от OOM.

Тюнинг сборщика мусора G1GC для устранения фризов#

Стандартный сборщик мусора Java может вызывать зависания сервера длительностью от 500 мс до 3 секунд при переполнении региона Old Generation (старых объектов). Для динамической игры это выражается в рассинхронизации транспорта и атаках невидимых зомби.

Флаги оптимизации G1GC для Project Zomboid:

  • -XX:+UseG1GC: включает современный сборщик мусора Garbage-First, разделяющий память на независимые регионы.
  • -XX:MaxGCPauseMillis=20: целевой ориентир максимальной паузы в 20 миллисекунд (в пределах одного игрового тика).
  • -XX:InitiatingHeapOccupancyPercent=45: сборка старого поколения запускается заранее, когда заполнено 45% кучи, а не в момент критического исчерпания памяти.
  • -XX:G1ReservePercent=15: резервирует 15% памяти для предотвращения ошибок сбоя аллокации (Evacuation Failure).

Мониторинг использования кучи через jstat и htop#

Для анализа реального расхода памяти процессом Java найдите идентификатор процесса сервера:

bash
pgrep -f "zombie.network.GameServer"

Запустите утилиту мониторинга памяти Java jstat, обновляющуюся каждую секунду:

bash
jstat -gcutil $(pgrep -f "zombie.network.GameServer") 1000

Обратите внимание на столбцы:

  • E (Eden): процент заполнения региона новых объектов.
  • O (Old): процент заполнения старых объектов.
  • FGC (Full GC Count): количество полных остановок мира. В здоровой системе этот счетчик должен быть равен 0.

Для общей оценки потребления памяти системой используйте free -m:

bash
free -h

Типичные ошибки конфигурации памяти и их исправление#

  1. Сервер внезапно закрывается с кодом Killed (Exit code 137): Это означает вмешательство Linux OOM-killer. Проверьте системный журнал ядра:
bash
sudo dmesg -T | grep -i oom

Если процесс ProjectZomboid6 был убит, уменьшите -Xmx на 1–2 ГБ, чтобы оставить запас под нативную память ОС.

  1. Бесконечный рост памяти и утечки из-за модов: Некоторые моды на карты и кастомную броню не выгружают кэш текстур. Запланируйте мягкий перезапуск сервера каждые 12–24 часа по cron:
bash
sudo crontab -l | grep zomboid

Добавьте задачу мягкого рестарта в 05:00 утра:

bash
0 5 * * * /usr/bin/systemctl restart zomboid

Источники#