Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/users/p/prom-auto/domains/prom-auto.ru/wiki/inc/parser/handler.php on line 1458
Настройки памяти jvm
Могу подсказать практически оптимальные значения, исходя из того, что ты показал и типичной нагрузки 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
И я подгоню настройки почти идеально.