jvm 如何禁用GC或获取某些代码执行之间的GC暂停时间?

k4emjkb1  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(168)

我以前读过一篇文章,FGC影响了时间,使应用程序产生错误的结果。
代码示例如下所示:

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发生在startend赋值之间,则时间将大于实际值并影响结果。
有一些方法可以修复。
一种方法是禁用它们之间的GC,我知道现在禁用GC是不可能的。我想知道是否有任何方法可以删除一些代码之间的safepoint(或者通过重构代码来实现?)
另一种方法是获取GC暂停时间,看起来(也许)不比第一种方法难。
回到问题上来:
如果我有一个时间敏感的逻辑,我怎样才能避免它受到GC的影响?

qyyhg6bp

qyyhg6bp1#

你可以在这里做一些事情(按难度递增的顺序,你可以合并其中一些):
1.使用尽可能大的堆运行测试(只有在避免任何GC的情况下,它才会起作用;一旦你点击GC,它将是一个长时间的停顿)。
1.使用比挂钟更好的计时。参见Java Microbenchmark Harness
1.使用多次运行通过删除顶部异常值来平均任何GC的影响。上面的JMH在这里有帮助。
1.询问您的JVM使用MXBeans. YMMV进行GC花费了多长时间,具体取决于JVM。
1.将所有GC暂停记录到GC日志中并在计算中使用这些暂停
1.修改您的代码,在临界区不进行分配(有关一些提示,请参阅thisthis文章)
1.阿苏尔系统公司的JVM叫做ZING has pauseless GC,这需要花钱。

相关问题