Почему SerialGC выбран вместо G1GC? - PullRequest
0 голосов
/ 24 сентября 2018

Я использую Java на очень похожих виртуальных машинах и не могу найти объяснение, почему SerialGC выбран вместо G1GC в одном случае.Это та же версия Java, та же ОС, тот же тип экземпляра виртуальной машины в AWS, и я подозреваю, что единственное отличие - это настройки контейнера, но я не знаю, как точно определить, какие изменения.Есть ли способ получить объяснение того, почему виртуальная машина решает выбрать эти или другие параметры?

Java-версия в обоих случаях:

java version "10.0.1" 2018-04-17 Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)

При запуске Javaв одном случае:

java -XX:+PrintFlagsFinal -XX:+PrintCommandLineFlag

выход:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 -XX:InitialHeapSize=253366976 -XX:MaxHeapSize=4053871616 -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseSerialGC [Global flags] (...) bool UseG1GC = false {product} {default} bool UseParallelGC = false {product} {default} bool UseSerialGC = true {product} {ergonomic}

И в другом:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 -XX:G1ConcRefinementThreads=8 -XX:InitialHeapSize=253480064 -XX:MaxHeapSize=4055681024 -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC [Global flags] (...) bool UseG1GC = true {product} {ergonomic} bool UseParallelGC = false {product} {default} bool UseSerialGC = false {product} {default}

1 Ответ

0 голосов
/ 24 сентября 2018

{ergonomic} в -XX:+PrintFlagsFinal означает, что флаг был установлен автоматически в зависимости от количества доступных процессоров и объема оперативной памяти.

JDK 10 рассматривает машину как «сервер» если у него есть как минимум 2 доступных процессора и 2 ГБ оперативной памяти.Это можно переопределить с помощью -XX:+AlwaysActAsServerClassMachine или -XX:+NeverActAsServerClassMachine флагов JVM.

Конфигурация «Сервер» предполагает G1 в качестве GC по умолчанию, в то время как машина «Клиент» использует SerialGC по умолчанию.

Чтобы рассчитать количество доступных процессоров, JDK использует не только видимые в ОС процессоры, но также ограничения сродства процессоров и cgroup, включая

  • cpu.shares
  • cpu.cfs_quota_us
  • cpuset.cpus

Поскольку вы запускаете Java в контейнере, вполне вероятно, что контейнер накладывает ограничения cgroup, что приводит к меньшему количеству доступных процессоровили объем памяти.Используйте -Xlog:os+container=trace, чтобы найти эффективные пределы в каждой конкретной среде.

...