之前看过一篇文章,说FGC影响时序,导致application出错结果。
代码示例如下:
long start = System.currentTimeInMillis();
doSomething();
// what if here comes a long time FGC pause
long end = System.currentTimeInMillis();
if (end - start > TIME_OUT) {
xxxx
}
如果GC发生在start
和end
赋值之间,时间会比实际值长,影响结果。
有一些方法可以修复。
一种方法是禁用它们之间的 GC,我知道暂时禁用 GC 是不可能的。我想知道是否有任何方法可以删除某些代码之间的 safepoint
(或重构代码以实现它?)。
另一种是获取 GC 暂停时间,似乎(也许)并不比第一种方法难。
回到问题:
如果我有一个时间敏感的逻辑,我怎样才能避免它被 GC 影响?
最佳答案
你可以在这里做一些事情(按难度递增的顺序,你可以结合其中的一些):
使用尽可能大的堆运行您的测试(只有当您可以避免任何 GC 时它才会起作用;一旦您遇到 GC,就会有很长的停顿)。
使用比挂钟更好的时间。参见 Java Microbenchmark Harness
通过多次运行,通过移除排名靠前的离群值来平均任何 GC 的影响。上面的 JMH 在这方面有所帮助。
询问您的 JVM 使用 MX Beans GC 花费了多长时间. YMMV 取决于 JVM。
将所有 GC 暂停记录到 GC 日志中并在计算中使用它们
Azul Systems 的 JVM 名为 ZING has pauseless GC .这会花钱。
关于java - 如何在某些代码执行之间禁用 GC 或获取 GC 暂停时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53870296/