我正在运行surefire测试,这使我进入了GC开销限制。但是,在分析了内存统计信息和快照之后,我意识到在字符串复制中浪费了将近800 MB。
深入研究VM参数和其他运行时参数,我意识到所用的GC是PS(并行清道夫-JVM的默认值)。
我修改了surefire argLine以使用
-XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics
现在我的测试正在使用G1GC。
以下是切换GC之前和之后的比较
我的问题:为什么G1GC使用了这么多的Old Gen,并且在整个测试过程中都没有收集到它。它一直在增长。
其余的环境和参数以及其他所有内容保持不变。唯一的变化是GC算法和重复数据删除。
我也一直在研究这些相关的线程
JVM G1GC's mixed gc not collecting much old regions
答案 0 :(得分:0)
除非达到阈值(默认情况下为总堆的45%),否则G1GC不会进行旧的代收集。您可以通过将XX:InitiatingHeapOccupancyPercent
设置为其他某个值来控制此阈值。