Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Настройки памяти jvm ====== <WRAP important>Страница в разработке!</WRAP> Могу подсказать **практически оптимальные значения**, исходя из того, что ты показал и типичной нагрузки **PLC / daemon-приложения под systemd**, даже без точных метрик. А также — **как быстро проверить, что они реально подходят**. Я буду исходить из предположений (поправь, если что-то не так): * Java 21 * долгоживущий сервис (24/7) * не веб-сервер, а логика / протоколы / I/O * стабильная, предсказуемая нагрузка * важна надёжность, а не максимальная пропускная способность --- ## Рекомендуемый стартовый вариант (оптимум «по умолчанию») ```bash -Xms256m -Xmx512m ``` 👉 **Это уже хороший и разумный выбор**, особенно для первого продакшена. Почему: * 256 MB хватает для старта без thrash * 512 MB — безопасный потолок для логики PLC * GC будет работать спокойно * сервис не «сожрёт» систему --- ## Когда стоит изменить значения ### 🔹 Вариант 1: сервис стабильно живёт и память не растёт (лучший сценарий) 👉 **Зафиксировать heap** ```bash -Xms512m -Xmx512m ``` **Плюсы** * нет расширений heap * более стабильный GC * предсказуемое поведение **Минус** * всегда заняты 512 MB 📌 Рекомендую, если: * сервер не очень ограничен по RAM * сервис критичный (PLC!) --- ### 🔹 Вариант 2: сервер маломощный (1–2 GB RAM) ```bash -Xms128m -Xmx384m ``` 📌 Подходит, если: * VPS / embedded / edge * мало памяти * нагрузка умеренная ⚠️ Следи за `OutOfMemoryError` --- ### 🔹 Вариант 3: высокая нагрузка / много объектов / буферы ```bash -Xms512m -Xmx1024m ``` 📌 Если: * много I/O * очереди сообщений * бинарные протоколы * рост GC-пауз --- ## ⚠️ Очень важный момент (часто забывают) ### `-Xmx` ≠ реальная память процесса Java-процесс потребляет: | Компонент | Память | | -------------- | -------------- | | Heap (`-Xmx`) | 512 MB | | Metaspace | 50–150 MB | | Thread stacks | 1–2 MB * N | | Direct buffers | зависит от I/O | | JVM internals | ~50 MB | 👉 **Реально:** `Xmx * 1.3–1.6` То есть при `-Xmx512m`: ``` ~700–800 MB RSS ``` --- ## 🔒 Очень рекомендую связать с systemd Добавь в `[Service]`: ```ini MemoryMax=1G ``` И тогда: * JVM не выйдет за пределы * OOM будет контролируемым * systemd сможет перезапустить сервис 📌 Хорошая пара: ```text -Xmx512m + MemoryMax=1G ``` --- ## Как точно понять «оптимум» за 10 минут ### 1️⃣ Посмотреть реальное потребление После запуска: ```bash ps -o pid,rss,cmd -p $(pidof java) ``` или ```bash systemctl status jrobo ``` --- ### 2️⃣ Включить GC-логи (Java 21) На время теста: ```bash -Xlog:gc ``` Если видишь: * частые GC → мало памяти * GC редко → можно уменьшать --- ### 3️⃣ Контроль через jcmd (очень полезно) ```bash jcmd <pid> GC.heap_info ``` --- ## 🎯 Мой итоговый совет для тебя Для **PLC / сервисного приложения**: ### ✔ Рекомендуемый продакшен ```bash -Xms512m -Xmx512m ``` * ```ini MemoryMax=1G ``` Это: * стабильно * предсказуемо * безопасно для systemd --- Если хочешь, дальше могу: * разобрать **Metaspace и Direct buffers** * подсказать **GC (G1/ZGC) под Java 21** * проверить unit-файл на **industrial best practices** Скажи: * сколько RAM у сервера * сколько потоков примерно * realtime или soft-realtime И я подгоню настройки **почти идеально**. doc/jroboplc/java_memory.txt Last modified: 2026/01/18 13:57by denis