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

И я подгоню настройки почти идеально.

doc/jroboplc/java_memory.txt · Последние изменения: 2026/01/17 17:12 — denis
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0