在 [1, page 16] Aleksey Shipil?v 中说,Shenandoah 2.0 在 JDK 13 GA 中可用。但是在Complete JDK 13 Release Notes [2](包括JDK 13 GA、JDK 13.0.1 GA、JDK 13.0.2 GA)中,并没有提到Shenandoah。
问: Shenandoah 2.0 在 JDK GA 中的当前状态是什么?它是否在 JDK 13 GA 中可用,或者如果没有,它计划用于哪个版本?
[1] https://shipilev.net/talks/jugbb-Sep2019-shenandoah.pdf
[2] https://www.oracle.com/technetwork/java/javase/13all-relnotes-5461743.html
我的 Mac 上有最新的 (13.0.1) OpenJDK,但它似乎不包括 Shenandoah。我疯了吗?我知道已经发货了 它可以在我的 Linux 机器上运行。有不同的下载吗?不同的旗帜?
~ $ java -XX:+UnlockExperimentalVMOptions -XX:+PrintCommandLineFlags -version
-XX:G1ConcRefinementThreads=4 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=134217728
-XX:MaxHeapSize=2147483648 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags
-XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UnlockExperimentalVMOptions
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
~ $ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+PrintCommandLineFlags -version
Error occurred during initialization of VM
Option -XX:+UseShenandoahGC not supported
Run Code Online (Sandbox Code Playgroud) 在Shenandoah 1.0每个对象中都有一个额外的头文件——称为forwarding pointer. 为什么需要它,导致它被消除的原因是什么Shenandoah 2.0?
对于关注其发展的人们来说,这并不是一个大秘密,Shenandoah一个主要的批评是它GC barriers用于每一次写入和读取:无论是引用还是原始。
Shenandoah 2.0声称这不再是问题,可以通过所谓的加载引用屏障解决。这是怎么发生的?