Различия
Здесь показаны различия между двумя версиями данной страницы.
| Следующая версия | Предыдущая версия | ||
|
doc:jroboplc:java_memory [2026/01/17 08:43] denis создано |
doc:jroboplc:java_memory [2026/01/17 17:12] (текущий) denis |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== Настройки памяты jvm ====== | + | ====== Настройки памяти jvm ====== |
| + | |||
| + | <note important>Страница в разработке!</note> | ||
| + | |||
| + | Могу подсказать **практически оптимальные значения**, исходя из того, что ты показал и типичной нагрузки **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 | ||
| + | |||
| + | И я подгоню настройки **почти идеально**. | ||