Статьи

Параметры JVM: -client vs -server

Вы когда-нибудь задумывались, что это за ключ -client или -server при запуске вашего java-приложения? например:

1
javaw.exe -client com.blogspot.sdoulger.LoopTest

которые также отображаются в справке java.exe, например, где параметры включают в себя:

-клиент выбрать «клиентскую» ВМ
-сервер для выбора «серверной» ВМ

В чем разница между системами -client и -server?

Эти две системы являются разными двоичными файлами. По сути, это два разных компилятора (JIT), взаимодействующих с одной и той же системой времени выполнения. Клиентская система оптимальна для приложений, которым требуется быстрое время запуска или небольшие размеры, серверная система оптимальна для приложений, где общая производительность наиболее важна. В целом, клиентская система лучше подходит для интерактивных приложений, таких как GUI. Некоторые из других отличий включают политику компиляции, настройки кучи по умолчанию и политику встраивания.

Согласно « Архитектуре Java HotSpot Performance Engine »:

JDK включает в себя два варианта виртуальной машины — предложение на стороне клиента и виртуальную машину, настроенную для серверных приложений. Эти два решения совместно используют базу кода среды выполнения Java HotSpot, но используют разные компиляторы, которые соответствуют совершенно уникальным характеристикам производительности клиентов и серверов. Эти различия включают политику компиляции компиляции и значения по умолчанию для кучи.

JDK содержит обе эти системы в дистрибутиве, поэтому разработчики могут выбрать, какую систему они хотят, указав -client или -server.

Хотя виртуальные машины сервера и клиента похожи, виртуальная машина сервера была специально настроена для максимизации пиковой скорости работы. Он предназначен для запуска долго работающих серверных приложений, которым требуется максимально высокая скорость работы, превышающая быстрое время запуска или меньший объем памяти во время выполнения.

Компилятор клиентской виртуальной машины служит обновлением как для классической виртуальной машины, так и для JIT-компиляторов, используемых в предыдущих версиях JDK. Клиентская виртуальная машина предлагает улучшенную производительность во время выполнения для приложений и апплетов. Клиентская виртуальная машина Java HotSpot была специально настроена для уменьшения времени запуска приложения и использования памяти, что делает его особенно подходящим для клиентских сред. В целом, клиентская система лучше для GUI.

Компилятор виртуальной машины клиента не пытается выполнить многие из более сложных оптимизаций, выполняемых компилятором на виртуальной машине сервера, но в обмен на это требуется меньше времени для анализа и компиляции фрагмента кода. Это означает, что клиентская виртуальная машина может запускаться быстрее и требует меньшего объема памяти.

Примечание. Похоже, что основной причиной различий в производительности является количество оптимизаций.

Виртуальная машина сервера содержит усовершенствованный адаптивный компилятор, который поддерживает многие из тех же типов оптимизации, которые выполняются путем оптимизации компиляторов C ++, а также некоторые оптимизации, которые не могут быть выполнены традиционными компиляторами, такие как агрессивное встраивание между вызовами виртуальных методов. Это конкурентное и эксплуатационное преимущество перед статическими компиляторами. Технология адаптивной оптимизации очень гибка в своем подходе и обычно превосходит даже передовые методы статического анализа и компиляции.

Оба решения обеспечивают чрезвычайно надежную, безопасную и поддерживаемую среду для удовлетворения потребностей современных корпоративных клиентов.

Варианты по умолчанию:

  • Для Hotspot это клиент
  • Для JRockit это сервер

Параметры клиентской и серверной виртуальной машины JRockit
JRockit также имеет эти две опции с опцией сервера по умолчанию (Hotspot является клиентом).
Опция клиента JRockit — -client, а сервер — -jrockit.

Практический пример разницы в производительности
Пример взят из блога Онкара Джоши, который доказывает разницу в производительности.

Мы запускаем следующий код с обоими переключателями:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
package com.blogspot.sdoulger;
 
public class LoopTest {
    public LoopTest() {
        super();
    }
 
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        spendTime();
        long end = System.currentTimeMillis();
        System.out.println("Time spent: "+ (end-start));
         
        LoopTest loopTest = new LoopTest();
    }
 
    private static void spendTime() {
        for (int i =500000000;i>0;i--) {
        }
    }
}

Примечание: код был скомпилирован только один раз! Классы одинаковы в обоих заездах!

С -клиентом:
java.exe -client -classpath C: \ JDeveloper \ mywork \ Test_java_client-server_switches \ Project1 \ classes com.blogspot.sdoulger.LoopTest
Потрачено времени: 766

С -сервером:
java.exe -server -classpath C: \ JDeveloper \ mywork \ Test_java_client-server_switches \ Project1 \ classes com.blogspot.sdoulger.LoopTest
Потраченного времени: 0

Похоже, что для более агрессивной оптимизации серверной системы удалите цикл, поскольку он понимает, что не выполняет никаких действий!

Копать больше / источники:

Ссылка: Разница между параметрами командной строки JVM -client и -server от нашего партнера по JCG Spyros Doulgeridis в блоге Spyro’s Log .

Статьи по Теме :