我以前读过一篇文章,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发生在start
和end
赋值之间,则时间将大于实际值并影响结果。
有一些方法可以修复。
一种方法是禁用它们之间的GC,我知道现在禁用GC是不可能的。我想知道是否有任何方法可以删除一些代码之间的safepoint
(或者通过重构代码来实现?)
另一种方法是获取GC暂停时间,看起来(也许)不比第一种方法难。
回到问题上来:
如果我有一个时间敏感的逻辑,我怎样才能避免它受到GC的影响?
1条答案
按热度按时间qyyhg6bp1#
你可以在这里做一些事情(按难度递增的顺序,你可以合并其中一些):
1.使用尽可能大的堆运行测试(只有在避免任何GC的情况下,它才会起作用;一旦你点击GC,它将是一个长时间的停顿)。
1.使用比挂钟更好的计时。参见Java Microbenchmark Harness
1.使用多次运行通过删除顶部异常值来平均任何GC的影响。上面的JMH在这里有帮助。
1.询问您的JVM使用MXBeans. YMMV进行GC花费了多长时间,具体取决于JVM。
1.将所有GC暂停记录到GC日志中并在计算中使用这些暂停
1.修改您的代码,在临界区不进行分配(有关一些提示,请参阅this或this文章)
1.阿苏尔系统公司的JVM叫做ZING has pauseless GC,这需要花钱。