Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何禁用GC或获取某些代码执行之间的GC暂停时间?_Java_Jvm - Fatal编程技术网

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

Java 如何禁用GC或获取某些代码执行之间的GC暂停时间?,java,jvm,Java,Jvm,在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发生在开始和结束分配之间,则时间

在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发生在
开始
结束
分配之间,则时间将超过实际值并影响结果

有一些方法可以修复。
一种方法是禁用它们之间的GC,我知道现在不可能禁用GC。我想知道是否有任何方法可以删除某些代码之间的
safepoint
(或者重构代码以实现它?)

另一种方法是获得GC暂停时间,似乎(可能)并不比第一种方法更难

回到问题:

如果我有一个时间敏感的逻辑,我如何避免它受到GC的影响?

您可以在这里做一些事情(按照难度的增加顺序,您可以将其中一些结合起来):

  • 使用尽可能大的堆运行测试(只有在能够避免任何GC的情况下,它才会起作用;一旦碰到GC,就会有很长的暂停)
  • 使用比挂钟更好的计时方式。看
  • 使用多次运行,通过删除顶部异常值来平均任何GC输出的影响。上面的JMH在这里很有帮助
  • 询问JVM使用GC的时间。YMMV取决于JVM
  • 将所有GC暂停记录到GC日志中,并在计算中使用这些暂停
  • 在关键部分修改代码,使其不进行分配(有关一些提示,请参阅或文章)
  • Azul Systems的JVM称为。这要花钱
  • 希望这对你有所帮助,祝你圣诞快乐