簡體   English   中英

為什么選擇SerialGC而不是G1GC?

[英]Why is SerialGC chosen over G1GC?

我在非常相似的VM上運行Java,但在一種情況下找不到為什么選擇SerialG而不是G1GC的解釋。 它在AWS上具有相同的Java版本,相同的操作系統,相同的VM實例類型,我懷疑唯一的區別是容器設置,但我不知道如何查明哪些更改。 是否有辦法解釋為什么VM決定選擇此設置或其他設置?

兩種情況下的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}

-XX:+PrintFlagsFinal {ergonomic}表示該標志是根據可用處理器的數量和RAM的數量自動設置的。

如果JDK 10至少具有2個可用CPU和2 GB RAM,則將其視為“服務器” 可以使用-XX:+AlwaysActAsServerClassMachine-XX:+NeverActAsServerClassMachine JVM標志覆蓋它。

“服務器”配置假定G1為默認GC ,而“客戶端”計算機默認使用SerialGC

為了計算可用處理器的數量,JDK不僅使用OS中可見的CPU,還使用處理器關聯性和cgroup限制,包括

  • 中央處理器
  • cpu.cfs_quota_us
  • cpuset.cpus

由於您在容器中運行Java,因此容器可能會施加cgroup限制,從而導致可用CPU數量或內存量減少。 使用-Xlog:os+container=trace查找每個特定環境中的有效限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM