在Stop-The-World GC期间是否会停止使用scheduleWithFixedDelay调度的java运行任务?

时间:2013-09-13 01:58:06

标签: java garbage-collection schedule

我想实现一种心跳机制,其中子进程会定期ping父进程,告诉父进程它仍然存活。我用这种方式用threadPool的scheduleWithFixedDelay方法实现了ping任务:

   pingService.scheduleWithFixedDelay(new PingGroomServer(umbilical,
          taskId), 0, pingPeriod, TimeUnit.MILLISECONDS);  

umbilical是父进程的RPC客户端吗?

可以使用固定延迟安排scheduleWithFixedDelay吗?在Stop-The-World GC期间是否会停止ping线程? 实际上,即使在我等待6 * pingPeriod ms后,我仍然会错过心跳。

2 个答案:

答案 0 :(得分:1)

是的,stop-the-world正是它所说的那样 - 每个访问堆上没有特别涉及垃圾收集器的对象的线程都会被停止。

如果您想在java中使用心跳,最好将其分配到仅运行该代码的单独VM,以便VM暂停时间不会太长。或者更好的是,不依赖于毫秒时间 - 您无法假设桌面操作系统中的进程之间的调度级别。

答案 1 :(得分:1)

因此,在应用程序中有更多确定性运行时(Gc暂停,线程调度等)有多种选择

  1. 可预测,实时。一种方法是基于RTSJ或其他实时Java实现来实现实时Java实现,例如: http://fiji-systems.com/ http://www.aicas.com/ http://www-03.ibm.com/linux/realtime.html
  2. 低延迟,没有停止世界的GC。另一种方法是使用Java实现,没有世界各地的垃圾收集暂停,例如来自Azul系统的Zing JVM,它使用低延迟并发收集器。 http://www.azulsystems.com/solutions/low-latency/overview
  3. 由于上述选择对于小型应用程序来说可能是一个相当大的步骤,因此您可以使用“经典”Java实现来完成这些任务。

    因此,如果您希望使用Oracle / OpenJDK JVM进行短暂的GC暂停,则需遵守一些规则:

    • 硬件 - 这是最重要的。您必须具有带有快速多线程CPU和快速内存模块的SMP系统。避免交换。因此,您拥有的硬件越快,垃圾收集器的执行速度就越快。
    • 使用多线程垃圾收集器。如果您使用的是Oracle JVM,请选择G1或parallelGC(也称为吞吐量收集器)
    • 使用较小的堆,较大的堆必须由垃圾收集器处理的空间越多。
    • 调整内存(堆)人体工程学。微调你的记忆人体工程学,让对象在年轻一代收集(而不是升级到老一代),以避免完全垃圾收集。

    类似问题的另一个答案: Why will a full gc on small heap takes 5 seconds?

    有关GC人体工程学的更多信息: http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html