我想实现一个心跳机制,子进程会定期 ping 父进程,告诉父进程它仍然活着。我通过threadPool的scheduleWithFixedDelay方法实现ping任务是这样的:
pingService.scheduleWithFixedDelay(new PingGroomServer(umbilical,
taskId), 0, pingPeriod, TimeUnit.MILLISECONDS);
脐带是父进程的 RPC 客户端?
scheduleWithFixedDelay 可以安排固定延迟吗? Stop-The-World GC 期间 ping 线程会停止吗? 实际上,即使我等待了 6 * pingPeriod 毫秒,我仍然错过了心跳。
最佳答案
因此,您的应用程序中有多种选择可以实现更具确定性的运行时(Gc 暂停、线程调度等)
- 可预测、实时。一种方法是基于 RTSJ 或其他实时 Java 实现的实时 Java 实现,例如: http://fiji-systems.com/ http://www.aicas.com/ http://www-03.ibm.com/linux/realtime.html
- 低延迟,不进行 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/