Java Runtimes. Отличия между client, server и tiered

июня
18
2014

При использовании HotSpot VM есть на выбор два основных типа JVM Runtime: client и server. Для переключение в режим client необходимо добавить аргумент -client в строку запуска. Например, java -client -cp ... Для переключения в режим server необходимо добавить аргумент -server в строку запуска.

Client Runtime характеризуется быстрым запуском, небольшим потреблением памяти и JIT компилятором с быстрой генерации кода. Server Runtime предлагает более сложные оптимизации генерации кода, которые являются предпочтительными в серверном окружении. Многие из оптимизаций, применяемых в Server Runtime требуют дополнительное время для анализа информации о поведении программы и для генерации более эффективного кода.

Существует еще один дополнительный тип Runtime - tired, который сочетает в себе лучшее из клиентской и серверной сред выполнения. То есть, быстрый запуск и высокопроизводительно оптимизированный код. Если вы используете Java 6 Update 25, или версию новее, то вы можете рассмотреть этот Runtime в качестве замены клиентской среды выполнения. Для включения среды выполнения tired, необходимо добавить следующие аргументы в строку запуска:


-server -XX:+TieredCompilation

или если вы используете 64-разрядную Java:


-XX:+TieredCompilation

Как правило, server runtime использует интерпретатор для сбора информации о профилировании методов, которые затем попадают в компилятор. В tiered схеме, в дополнение к интерпретатору, компилятор используется для генерации скомпилированных версий методов, которые собирают профилирования информацию о себе. Поскольку скомпилированный код существенно быстрее, чем интерпретируемый, программа выполняется с большей производительностью на этапе профилирования. Во многих случаях, скорость запуска может оказаться выше, чем с client runtime, так как окончательный код, созданный компилятором сервера может быть недоступен на ранних этапах инициализации приложения. Tiered Runtime может также показывать лучшего пиковую производительность, чем обычный runtime, так как быстрая фаза профилирования приводит к более длительному периоду профилирования, который может дать лучшую оптимизацию.

Если вы не знаете, какой выбрать Runtime, начните с серверного (то есть, добавьте аргумент -server). Если время запуска и потребление памяти не соответствует ожиданиям и вы используете Java 6 Update 25 или более позднюю версию, попробуйте tired Runtime (-server -XX:+TieredCompilation). Если вы не используете более раннюю версию Java, чем Java 6 Update 25 и серверная среда выполнения не может удовлетворить ваши потребности во скорости запуска и потребляемой памяти, переключитесь на клиентскую среду выполнения (-client).

32-bit JVM

По умолчанию для 32-разрядной Java используется клиентская среда выполнения. Подтверждается это одинаковым содержимым, которое отображают следующие две комманды:


java -XX:+PrintFlagsFinal -version
и
java -client -XX:+PrintFlagsFinal -version

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


java -client -XX:+PrintFlagsFinal -version
и
java -server -XX:+PrintFlagsFinal -version

java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) Server VM (build 24.60-b09, mixed mode)

-client -server
intx AliasLevel = 3 {C2 product}
bool AlignVector = false {C2 product}
intx AutoBoxCacheMax = 128 {C2 product}
bool BlockLayoutByFrequency = true {C2 product}
intx BlockLayoutMinDiamondPercentage = 20 {C2 product}
bool BlockLayoutRotateLoops = true {C2 product}
bool BranchOnRegister = false {C2 product}
bool C1UpdateMethodData = false {C1 product} bool C1UpdateMethodData = true {C1 product}
intx CICompilerCount = 1 {product} intx CICompilerCount = 2 {product}
intx CompileThreshold = 1500 {pd product} intx CompileThreshold = 10000 {pd product}
intx ConditionalMoveLimit = 3 {C2 pd product}
bool DoEscapeAnalysis = true {C2 product}
intx EliminateAllocationArraySizeLimit = 64 {C2 product}
bool EliminateAllocations = true {C2 product}
bool EliminateLocks = true {C2 product}
bool EliminateNestedLocks = true {C2 product}
bool IncrementalInline = true {C2 product}
uintx InitialCodeCacheSize = 163840 {pd product} uintx InitialCodeCacheSize = 2359296 {pd product}
uintx InitialHeapSize := 16777216 {product} uintx InitialHeapSize := 64627968 {product}
bool InsertMemBarAfterArraycopy = true {C2 product}
intx InteriorEntryAlignment = 4 {C2 pd product}
intx LiveNodeCountInliningCutoff = 20000 {C2 product}
intx LoopMaxUnroll = 16 {C2 product}
intx LoopOptsCount = 43 {C2 product}
intx LoopUnrollLimit = 50 {C2 pd product}
intx LoopUnrollMin = 4 {C2 product}
bool LoopUnswitching = true {C2 product}
uintx MarkSweepDeadRatio = 5 {product} uintx MarkSweepDeadRatio = 1 {product}
uintx MaxHeapFreeRatio = 70 {manageable} uintx MaxHeapFreeRatio = 100 {manageable}
uintx MaxHeapSize := 268435456 {product} uintx MaxHeapSize := 1035993088 {product}
intx MaxJumpTableSize = 65000 {C2 product}
intx MaxJumpTableSparseness = 5 {C2 product}
intx MaxLabelRootDepth = 1100 {C2 product}
intx MaxLoopPad = 11 {C2 product}
intx MaxNodeLimit = 75000 {C2 product}
uint64_t MaxRAM = 1073741824 {pd product} uint64_t MaxRAM = 0 {pd product}
intx MaxVectorSize = 32 {C2 product}
uintx MinHeapFreeRatio = 40 {manageable} uintx MinHeapFreeRatio = 0 {manageable}
intx MinJumpTableSize = 18 {C2 product}
intx MultiArrayExpandLimit = 6 {C2 product}
bool NeverActAsServerClassMachine = true {pd product} bool NeverActAsServerClassMachine = false {pd product}
intx NodeLimitFudgeFactor = 1000 {C2 product}
intx NumberOfLoopInstrToAlign = 4 {C2 product}
intx OnStackReplacePercentage = 933 {pd product} intx OnStackReplacePercentage = 140 {pd product}
bool OptimizeFill = true {C2 product}
bool OptimizePtrCompare = true {C2 product}
bool OptimizeStringConcat = true {C2 product}
bool OptoBundling = false {C2 pd product}
bool OptoScheduling = false {C2 pd product}
uintx ParallelGCThreads = 0 {product} uintx ParallelGCThreads = 4 {product}
bool PartialPeelAtUnsignedTests = true {C2 product}
bool PartialPeelLoop = true {C2 product}
intx PartialPeelNewPhiDelta = 0 {C2 product}
uintx PermMarkSweepDeadRatio = 20 {product} uintx PermMarkSweepDeadRatio = 5 {product}
uintx PermSize = 12582912 {pd product} uintx PermSize = 16777216 {pd product}
bool ProfileInterpreter = false {pd product} bool ProfileInterpreter = true {pd product}
bool ReassociateInvariants = true {C2 product}
bool ReduceBulkZeroing = true {C2 product}
bool ReduceFieldZeroing = true {C2 product}
bool ReduceInitialCardMarks = true {C2 product}
uintx ReservedCodeCacheSize = 33554432 {pd product} uintx ReservedCodeCacheSize = 50331648 {pd product}
bool RewriteBytecodes = false {pd product} bool RewriteBytecodes = true {pd product}
bool RewriteFrequentPairs = false {pd product} bool RewriteFrequentPairs = true {pd product}
bool SplitIfBlocks = true {C2 product}
intx TrackedInitializationLimit = 50 {C2 product}
intx TypeProfileMajorReceiverPercent = 90 {C2 product}
bool UseBimorphicInlining = true {C2 product}
bool UseCondCardMark = false {C2 product}
bool UseDivMod = true {C2 product}
bool UseFPUForSpilling = false {C2 product}
bool UseJumpTables = true {C2 product}
bool UseLoopPredicate = true {C2 product}
bool UseOldInlining = true {C2 product}
bool UseOnlyInlinedBimorphic = true {C2 product}
bool UseOptoBiasInlining = true {C2 product}
bool UseParallelGC = false {product} bool UseParallelGC := true {product}
bool UseParallelOldGC = false {product} bool UseParallelOldGC = true {product}
bool UseRDPCForConstantTableBase = false {C2 product}
bool UseSharedSpaces = true {product} bool UseSharedSpaces = false {product}
bool UseSuperWord = true {C2 product}
intx ValueSearchLimit = 1000 {C2 product}

Тесты проводились на машине с 4 гигабайтами памяти.

Между tiered и серверной средами выполнения следующие отличия:


java -server -XX:+TieredCompilation -XX:+PrintFlagsFinal -version
и
java -server -XX:+PrintFlagsFinal -version

java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) Server VM (build 24.60-b09, mixed mode)

-server -XX:+TieredCompilation -server
bool CICompilerCountPerCPU = true {product} bool CICompilerCountPerCPU = false {product}
intx CompilationPolicyChoice = 3 {product} intx CompilationPolicyChoice = 0 {product}
intx InlineSmallCode = 2000 {pd product} intx InlineSmallCode = 1000 {pd product}
uintx ReservedCodeCacheSize = 100663296 {pd product} uintx ReservedCodeCacheSize = 50331648 {pd product}
bool TieredCompilation := true {pd product} bool TieredCompilation = false {pd product}

64-bit JVM

По умолчанию для 64-разрядной Java используется серверная среда выполнения. Более того, аргимент -client не имеет никакого влияния. То есть, в 64-разрядной Java нельзя принудительно выполнять код в режиме клиентской среды выполнения. Подтверждается это одинаковым содержимым, которое отображают следующие три комманды:


java -XX:+PrintFlagsFinal -version
java -client -XX:+PrintFlagsFinal -version
java -server -XX:+PrintFlagsFinal -version

java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

Различия между средами выполнения tiered и server такие же как и для 32-разрядной Java:

-XX:+TieredCompilation default
bool CICompilerCountPerCPU = true {product} bool CICompilerCountPerCPU = false {product}
intx CompilationPolicyChoice = 3 {product} intx CompilationPolicyChoice = 0 {product}
intx InlineSmallCode = 2000 {pd product} intx InlineSmallCode = 1000 {pd product}
uintx ReservedCodeCacheSize = 100663296 {pd product} uintx ReservedCodeCacheSize = 50331648 {pd product}
bool TieredCompilation := true {pd product} bool TieredCompilation = false {pd product}

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии