java - 使用scheduleWithFixedDelay安排的java运行任务会在Stop-The-World GC期间停止吗?

标签 java garbage-collection schedule

我想实现一个心跳机制,子进程会定期 ping 父进程,告诉父进程它仍然活着。我通过threadPool的scheduleWithFixedDelay方法实现ping任务是这样的:

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

脐带是父进程的 RPC 客户端?

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

最佳答案

因此,您的应用程序中有多种选择可以实现更具确定性的运行时(Gc 暂停、线程调度等)

  1. 可预测、实时。一种方法是基于 RTSJ 或其他实时 Java 实现的实时 Java 实现,例如: http://fiji-systems.com/ http://www.aicas.com/ http://www-03.ibm.com/linux/realtime.html
  2. 低延迟,不进行 stop-the-world GC。另一种方法是使用没有停止世界垃圾收集暂停的 Java 实现,例如 Azul 系统中的 Zing JVM,它使用低延迟并发收集器。 http://www.azulsystems.com/solutions/low-latency/overview

由于上述选择对于小型应用程序来说可能是相当大的一步,因此您可以使用“经典”Java 实现来完成一些操作。

因此,如果您希望 Oracle/OpenJDK JVM 具有短暂的 GC 暂停,那么有一些经验法则:

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

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

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

关于java - 使用scheduleWithFixedDelay安排的java运行任务会在Stop-The-World GC期间停止吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18777074/

相关文章:

ruby-on-rails - 你会如何建立这个每日类(class)表?

Django 和 celery : How do I schedule a job to run only once using Celery(similar to "at" command in linux)?

java - 获取外部存储目录不起作用

java - 为什么在 JNI 中调用纤程会在 JVM 中引发 StackOverflow?

c# - 在 C# 中测量内存压力/GC 执行

python - Python GC 会像这样处理引用循环吗?

java - 将图像插入 JTextPane 错误

java - Gson 中的自循环引用

.net - C# 垃圾收集器交叉引用

api - 通过 Gmail SMTP API 发送预定的电子邮件