Как уменьшить использование оперативной памяти

1. Анализ текущего потребления ресурсов

Перед оптимизацией определите, сколько памяти реально потребляет сервер и системные процессы.

  1. Подключитесь к выделенному серверу по SSH:
    ssh root@<IP_ВАШЕГО_СЕРВЕРА_PROXIFY>
    
  2. Проверьте общую статистику памяти:
    free -h
    
    Обратите внимание на столбцы used и available. available показывает память, которую можно выделить приложениям без свопа.
  3. Посмотрите потребление процесса Java (Minecraft):
    ps aux | grep java
    
    Найдите PID и столбец RSS (Resident Set Size) — это реальная физическая память, занятая процессом.
  4. В панели proxify.cloud (раздел «Консоль» или «Статистика» контейнера/VM) сверьтесь с графиками RAM Usage. Если график показывает 100% утилизации, а free -h показывает свободную память — проблема в кэше файловой системы или неправильных лимитах контейнера (LXC).

2. Настройка JVM-флагов (Ключевой этап)

Неправильные флаги запуска — главная причина перерасхода памяти. Xmx задает только кучу (Heap), но Java использует также Metaspace, Code Cache, Thread Stacks, Direct Memory и нативные буферы (Netty, LWJGL).

2.1. Расчет лимитов

Для выделенного сервера на Ubuntu под Proxmox (proxify.cloud) оставьте 2–3 ГБ под ОС, кэш диска и системные сервисы (systemd, sshd, мониторинг).

  • Если у сервера 16 ГБ RAM: -Xmx12G — максимум.
  • Если 32 ГБ RAM: -Xmx26G — максимум.

2.2. Рекомендуемые флаги для Paper / Purpur / Pufferfish (Java 17/21)

Откройте файл запуска. В панели proxify.cloud это обычно делается через «Файловый менеджер» в папке сервера (/home/container или /var/lib/minecraft), либо через SSH:

nano /home/container/start.sh
# или
nano /opt/minecraft/start.sh

Замените содержимое на оптимизированный набор (пример для 12 ГБ кучи):

#!/bin/bash
# Путь к Java (проверьте: which java)
JAVA_PATH="/usr/bin/java"

# Настройки памяти
HEAP="12G"
METASPACE="256M"

# Флаги JVM
JVM_FLAGS=(
  "-Xms${HEAP}" "-Xmx${HEAP}"
  "-XX:MaxMetaspaceSize=${METASPACE}"
  "-XX:+UseG1GC"
  "-XX:G1HeapRegionSize=16M"
  "-XX:+UnlockExperimentalVMOptions"
  "-XX:+ParallelRefProcEnabled"
  "-XX:MaxGCPauseMillis=100"
  "-XX:+DisableExplicitGC"
  "-XX:+AlwaysPreTouch"
  "-XX:G1NewSizePercent=30"
  "-XX:G1MaxNewSizePercent=40"
  "-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"
  "-Dterminal.jline=false"
  "-Dterminal.ansi=true"
  "-Dlog4j2.formatMsgNoLookups=true"
  "--add-modules=jdk.incubator.vector"
)

# Запуск
exec ${JAVA_PATH} "${JVM_FLAGS[@]}" -jar paper.jar --nogui

Важные параметры:

  • -Xms = -Xmx: предотвращает расширение кучи во время работы, снижая фрагментацию и накладные расходы.
  • -XX:MaxMetaspaceSize: ограничивает память под метаданные классов (по умолчанию неограниченно, может съесть 1-2 ГБ на больших модпаках).
  • -XX:+AlwaysPreTouch: заставляет ОС выделить физические страницы памяти при старте, уменьшая задержки (latency spikes) позже.
  • -XX:+PerfDisableSharedMem: отключает файл /tmp/hsperfdata_<user>, экономит немного RAM и улучшает безопасность в контейнерах LXC.

2.3. Для Fabric / Forge (модпаки)

Добавьте флаги для уменьшения нативной памяти:

  "-XX:MaxDirectMemorySize=2G"
  "-Dio.netty.maxDirectMemory=2G"

Netty (сетевая библиотека) аллоцирует Direct Memory вне кучи. Без лимита она может уйти в OOM Killer.

3. Оптимизация конфигурации сервера (paper.yml / spigot.yml / bukkit.yml)

Правьте файлы в корне сервера через файловый менеджер proxify.cloud или nano.

3.1. paper.yml — наибольшее влияние

# paper.yml
settings:
  # Уменьшает память на хранение чанков в очереди сохранения
  chunk-task-interval: 200
  # Отключает логирование спавна сущностей (экономит RAM на строках лога)
  log-villager-deaths: false
  log-named-deaths: false
  
  # Настройки мобов — критично для RAM
  mob-spawner-tick-rate: 2
  prevent-moving-into-unloaded-chunks: true
  max-entity-collisions: 2
  
  # Кэширование
  chunk-load-timeout: 30
  chunk-unload-delay: 10s
  keep-spawn-loaded: false
  keep-spawn-loaded-range: 3

  # Карты (map items) потребляют много памяти при большом количестве
  map-item-limit: 256

  # Контейнеры (сундуки, шалкеры) — оптимизация NBT
  container-update-tick-rate: 1
  hopper-transfer: 8
  hopper-check: 1
  hopper-amount: 1

# Настройки сохранения миров (редуцирует I/O и RAM буферы)
world-settings:
  default:
    save-structure-info: false
    auto-save-interval: 6000 # 5 минут вместо стандартных 6000 тиков (5 мин), можно поставить 9000 (7.5 мин)
    optimize-explosions: true
    disable-chest-cat-detection: true
    disable-creeper-lingering-effect: true

3.2. spigot.yml

# spigot.yml
settings:
  save-user-cache-on-stop-only: true
  user-cache-size: 500 # Уменьшите с 1000, если игроков мало
  entity-activation-range:
    animals: 16
    monsters: 24
    raiders: 48
    misc: 8
    water: 4
    villagers: 16
    flying-monsters: 48
  # Ограничение тиков сущностей
  entity-tracking-range:
    players: 48
    animals: 48
    monsters: 48
    misc: 32
    other: 48
  tick-inactive:
    animals: true
    monsters: true
    villagers: true

3.3. bukkit.yml

# bukkit.yml
spawn-limits:
  monsters: 50      # Стандарт 70
  animals: 10       # Стандарт 10
  water-animals: 5  # Стандарт 15
  water-ambient: 2  # Стандарт 20
  ambient: 1        # Стандарт 10
chunk-gc:
  period-in-ticks: 400 # Чаще чистить неиспользуемые чанки
ticks-per:
  animal-spawns: 400
  monster-spawns: 1
  water-spawns: 400
  ambient-spawns: 400

4. Плагины для управления памятью

Установите только проверенные плагины. Избегайте «антилаг» плагинов, которые спавнят потоки.

  1. Spark (профилирование и GC мониторинг) — обязателен.

    # Скачайте в plugins/
    wget -O plugins/Spark.jar https://ci.lucko.me/job/spark/lastSuccessfulBuild/artifact/spark-bukkit/build/libs/spark-*.jar
    

    Команды в игре: /spark memory, /spark gc, /spark heapdump (анализируйте дамп в VisualVM или Eclipse MAT).

  2. Chunky (предгенерация мира) — предотвращает лаги генерации, которые вызывают всплески RAM.

    wget -O plugins/Chunky.jar https://github.com/pop4959/Chunky/releases/latest/download/Chunky-Spigot.jar
    

    Выполните предгенерацию: /chunky radius 5000, /chunky start.

  3. FarmLimiter / MobFarmManager — жестко лимитируйте количество сущностей на чанк (например, max: 20 для мобов). Каждая сущность — это объект в куче + нативная память на физику.

  4. ClearLagg (только авто-очистка предметов на земле) — настройте auto-clear-interval: 1800 (30 мин). Не используйте его для очистки мобов — лучше FarmLimiter.

5. Настройка ОС Ubuntu (Host Level)

Выделенный сервер на proxify.cloud дает полный контроль над Ubuntu.

5.1. Swappiness

Запретите агрессивный свопинг (Java GC + Swap = смерть производительности).

echo "vm.swappiness=1" >> /etc/sysctl.d/99-minecraft.conf
sysctl --system

Проверьте: cat /proc/sys/vm/swappiness (должно быть 1).

5.2. Huge Pages (Transparent Huge Pages — THP)

Для Java лучше отключить THP, чтобы избежать задержек на дефрагментацию больших страниц.

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# Сделать постоянным через systemd:
cat <<EOF > /etc/systemd/system/disable-thp.service
[Unit]
Description=Disable Transparent Huge Pages
DefaultDependencies=no
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
WantedBy=multi-user.target
EOF
systemctl enable disable-thp.service
systemctl start disable-thp.service

5.3. Лимиты для пользователя minecraft

Если сервер запускается не от root (что правильно), настройте limits.conf: ```