禁用Java垃圾回收为何反而导致性能下降?
Java堆分配性能探究:EpsilonGC禁用GC后性能反而下降的原因
我正在研究Java堆分配对应用整体性能的影响,为此编写了一个创建大量对象的简单程序:
public static void main(final String... args) { int sum = 0; for (int i = 0; i < 4_000_000; ++i) { final Product product = new Product(i); sum += product.price(); } System.out.printf("Total: %d\n", sum); } private static class Product { final String name = new String("Banana"); final int price; private Product(final int price) { this.price = price; } public int price() { return this.price % 100; } }
通过JMH测试,程序默认执行时间约为12.265ms。为探究禁用垃圾回收的影响,我使用EpsilonGC并添加以下JVM参数:
-Xmx12294M -Xms12294M -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
测试后执行时间意外升至69.188ms,与预期相悖。我困惑于禁用垃圾回收为何会大幅降低性能,是内存中对象数量增加导致分配时间变长,还是存在其他原因?
补充信息
1. JMH微基准测试代码
public class ProductsTest { public static void main(String[] args) throws RunnerException { new Runner( new OptionsBuilder() .forks(1) .warmupIterations(1) .measurementIterations(1) .warmupTime(TimeValue.seconds(3)) .measurementTime(TimeValue.seconds(3)) .mode(Mode.AverageTime) .timeUnit(TimeUnit.MILLISECONDS) .build() ).run(); } @Benchmark public void products() { Products.main(); } }
2. 系统属性
- Apache Maven 3.9.0
- Java: azul-11(Java版本11.0.12)
- OS名称:"mac os x",版本:"12.5",架构:"x86_64",系列:"Mac"
- 可用内存:16G
内容的提问来源于stack exchange,提问作者Volodya Lombrozo
相关产品推荐
相关产品推荐

