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

标签 java jvm

之前看过一篇文章,说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发生在startend赋值之间,时间会比实际值长,影响结果。

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

另一种是获取 GC 暂停时间,似乎(也许)并不比第一种方法难。

回到问题:
如果我有一个时间敏感的逻辑,我怎样才能避免它被 GC 影响?

最佳答案

你可以在这里做一些事情(按难度递增的顺序,你可以结合其中的一些):

  1. 使用尽可能大的堆运行您的测试(只有当您可以避免任何 GC 时它才会起作用;一旦您遇到 GC,就会有很长的停顿)。

  2. 使用比挂钟更好的时间。参见 Java Microbenchmark Harness

  3. 通过多次运行,通过移除排名靠前的离群值来平均任何 GC 的影响。上面的 JMH 在这方面有所帮助。

  4. 询问您的 JVM 使用 MX Beans GC 花费了多长时间. YMMV 取决于 JVM。

  5. 将所有 GC 暂停记录到 GC 日志中并在计算中使用它们

  6. 修改您的代码以在关键部分不进行分配(有关一些提示,请参阅 thisthis 文章)

  7. Azul Systems 的 JVM 名为 ZING has pauseless GC .这会花钱。

关于java - 如何在某些代码执行之间禁用 GC 或获取 GC 暂停时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53870296/

相关文章:

java - 简单的命令行Java编译

java - Bytebuddy拦截异常抛出

java - String.valueOf(int) 中的 ArrayOutOfBoundsException 怎么可能发生?

java - Android studio 创建jvm失败

mono - 在 CLR 和 JVM 中如何实现 Object.GetHashCode()?

java - 在 Java 中克隆对象时,字符串会发生什么?

java - 如何有效地小写集合的每个元素?

当系统日期/时间更改为过去的一天/时间时,JavaFX 卡住

Java,更改日期格式。

Java导入不公开的自定义类