有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JMH实验中GC什么时候应该设置为真

我从StackOverflow帖子中读到,不建议将GC设置为true,因为它会删除GC启发式。但是我想知道GC应该设置为True的场景

例如,我有一个基准测试方法,如下所示

@Benchmark
public int test(int a, int b){
   return a + b
}

如果我想具体衡量测试(5,6)的执行情况。为了避免JIT记住相同输入的结果,我将GC设置为True,这样在每次迭代后,返回值都会被强制GC擦除

这是设置GC为真的有效方案吗


非常感谢您指出该示例无法运行。是的,我只是做了一个转换来讨论什么是打开GC的有效方案。 我不打算使用“@State”,因为我可能还想测量test(665,666)。我愿意将它们声明为参数,并从Java CLI获取它们的值

由于这个虚构的例子,转换被从主题中拖走了。下面是:应该打开GC的JMH实验是什么


共 (1) 个答案

  1. # 1 楼答案

    你想做的事情与你想象的不一样,也与GC无关。在您的例子中,JIT优化和GC是不相关的。我想你最好的办法是了解你错了什么,以及如何通过JMH的样本。关于一个有趣的例子,请参见this,它解释了错误的基准代码设置如何导致错误的结果,它在某种程度上触及了您的观点

    如果你想测量a + b所做的事情,而不带JIT的偏见,那么你要做的是正确地设置JMH而不是禁用垃圾收集,这无论如何都不会有帮助

    总的来说,你应该在测试中考虑GC时间,imo——因为无论暂停(如果有)是什么,它本身就是基准的一部分,这是由于你的分配。另一方面,如果你想在没有任何GC影响的情况下测量时间,看看Epsilon GC,它确实做到了:它什么都不做。最后一点是ab必须通过JMH框架传递给@Benchmark方法:阅读更多关于@State的内容

    如果你阅读样本here(我至少会说前10个),并理解你可能会测试完全出乎意料的事情,比如计算aconstant与实际总和,那就更好了。具体来说,我认为阅读this exampleand this one about constant folding会让你受益匪浅