====== Настройки памяти 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 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
И я подгоню настройки **почти идеально**.