# Параметры запуска

{% hint style="warning" %}
Обязательно учтите, что аргументы следует подбирать индивидуально под оборудование сервера, а также версию Java.
{% endhint %}

Начнем с небольшого примера:

```
java -jar server.jar
```

Это самый обычный скрипт для запуска ядра сервера, в котором не указаны никакие дополнительные аргументы.

## Теперь о самих параметрах

**-jar** — этот аргумент указывает тип запускаемого **Java-файла**.

**name.jar** — название запускаемого файла.

**nogui** — осуществляет запуск сервера без графического интерфейса, потому что он нам попросту не нужен.

## Основные флаги

**-xincgc** — активирует «**‎сборщик мусора**», который время от времени будет выгружать неиспользуемую оперативную память. Тип сборщика автоматически выбирается в зависимости от версии **Java**.

**-server** — активирует серверную версию **Java**, в которой по умолчанию включена функция поддержки экспериментальных флагов. Также ускоряет компиляцию классов, что дает прирост в производительности, но увеличивает время запуска сервера (поддерживаются только **64-битные системы**).

## Выделение Оперативной памяти

{% hint style="info" %}
Аргументы поддерживают как «**M**‎» для мегабайтов, так и «‎**G**» для гигабайтов. Например, аргумент **Xms2G** будет запускать сервер с **2-мя** гигабайтами **Оперативной памяти**.
{% endhint %}

**-Xmx0000M** — количество максимальной выделяемой памяти для сервера.&#x20;

**-Xms0000M** — количество минимальной выделяемой памяти для сервера.

**-Xmn0000M** — количество выделяемой памяти для временных объектов

**-XX:MaxPermSize=0000M** — количество памяти для **PermGen Space** (не работает на **Java 8**).

**-XX:SharedReadOnlySize=0000M** — количество памяти под **read-only-место** в **PermGen**.

## Сборщики различного «мусора‎»

{% hint style="info" %}
Для одноядерных процессоров используйте любой сборщик мусора, но не указывайте количество потоков для него. На данный момент лучшим сборщиком является **ConcMarkSweepGC**. Чем больше число **SurvivorRatio** — тем лучше, соответственно тем меньше старые объекты будут захламлять **Оперативную память**. Чем больше значение **TargetSurvivorRatio,** тем большее количество объектов будет очищаться (желательно не ставить более 90). Использовать **MaxGCPauseMillis** лучше всего с **G1GC** или с конкретно указанным сборщиком мусора. **AutoGCSelectPauseMillis** — со сборщиком, который система сама выберет. **G1HeapRegionSize** лучше не устанавливать, **java** сама подберет оптимальное значение, использовать рекомендуем только в случае, если Вы знаете, что делаете.
{% endhint %}

\
\&#xNAN;**-XX:+UseSerialGC** — включает сборщик мусора, который работает в **1-ом потоке**.

-**XX:+UseConcMarkSweepGC** — включает сборщик мусора, который использует мощь **нескольких ядер процессора**.&#x20;

**-XX:ConcGCThreads=2** — количество потоков для **сборщика мусора**.&#x20;

**-XX:+UseG1GC** — активирует новый сборщик мусора, который **разделяет всю память** на определенные участки, и, благодаря использованию нескольких ядер, **собирает со всех участков неиспользуемую память**.

-**XX:G1HeapRegionSize=32** — количество **Оперативной памяти**, выделяемой под каждый участок.&#x20;

**-XX:AutoGCSelectPauseMillis=2500** — количество времени в миллисекундах между вызовом автоматически выбранного **сборщика мусора**.&#x20;

**-XX:MaxGCPauseMillis=1000** — длительность времени в миллисекундах между вызовом конкретного **сборщика мусора**. Для **G1GC** исполняет роль максимально установленного промежутка.&#x20;

**-XX:SurvivorRatio=8** — количество радиуса для существования выживающих объектов (чем меньше число, тем больше места). Большее место дает возможность недавно сгенерированным объектам **существовать дольше** перед очисткой мусора.

**-XX:TargetSurvivorRatio=90** — количество места в процентах под **выживающие объекты**, что позволит очищать больше неиспользуемых объектов **во время сборки мусора**.

**-XX:+UseBiasedLocking** — ускорение синхронизации объектов на многоядерных процессорах.&#x20;

**-XX:+UseFastAccessorMethods** — использование оптимизированных версий вызова методов.&#x20;

-**XX:+UseFastEmptyMethods** — исключение из компиляции пустых методов.

**XX:+UseCompressedOops** — уменьшение размеров указателя, заголовков, а также сдвигов внутри созданных объектов. В зависимости от кода сэкономит **20-60%** **Оперативной памяти**.

В общем итоге у нас получился подобный скрипт для запуска сервера:

```
java -Xincgc -Xms512M -Xmx4G -XX:MaxPermSize=128M -XX:SharedReadOnlySize=30M -XX:+UseConcMarkSweepGC -XX:+UseBiasedLocking -XX:+UseFastAccessorMethods -XX:+UseCompressedOops -jar server.jar nogui
```
