JVM "-server" против "-client"

Очень интересный трюк рассказал сегодня один из разработчиков. JVM можно запустить с двумя разными опциями -client и -server. При первом старте приложения (Java EE) увидели, что при использовании опции -client производительность вырастает вдвое, а использование памяти ниже.

Начали копать глубже и оказалось, что с таким поведением сталкнулись не только мы. Причина очень проста. При запуске с параметром -client JVM использует JIT compiler (от Apple) и компилирует классы без оптимизации и профайлинга, а при параемтре -server сначала запускается как интерпритатор и за несколько итераций собирает неободимые профайлы для классов и только потом компилирует их.

Поэтому использовать опцию -server при разработке не стоит, лучше запускать с -client. Так же имеет смысле просчитать сколько времени и при какой нагрузке “прогревается” приложение и в зависимости от результатов оставить всё как есть, либо добавить в код функции, которые позволят пройти этап сбора профайлов быстрее.

Tip #1: JBoss насильно добавляет параметр -server в конфиг.

UPD:
Поговорил еще и оказалось, что практики разработки с опцией -client, и дальнейшее использование с -server не существует (то есть то, что я предложил выше ерунда). Более того, JIT был в версии 1.3. Используется ли сейчас хотспот вместо него я не уверен, но вероятно.

Leave a Reply

Your email address will not be published. Required fields are marked *