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}

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі