1

我想实现一个心跳机制,其中子进程将定期 ping 父进程以告诉父进程它还活着。我用 threadPool 的 scheduleWithFixedDelay 方法实现 ping 任务:

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

脐带是RPC客户端到父进程吗?

scheduleWithFixedDelay 可以安排固定延迟吗?在 Stop-The-World GC 期间会停止 ping 线程吗?其实等了 6 * pingPeriod 毫秒后,我还是错过了心跳。

4

2 回答 2

3

因此,在您的应用程序中,有多种选择可以实现更确定的运行时(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

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

因此,如果您希望使用 Oracle/OpenJDK JVM 进行短暂的 GC 暂停,则有一些经验法则:

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

类似问题的另一个答案: 为什么小堆上的完整 gc 需要 5 秒?

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

于 2013-09-13T06:14:00.317 回答
1

是的,stop-the-world 正是它所说的——每个访问堆上的对象的线程都停止了与垃圾收集器无关的具体操作。

如果您想在 java 中使用心跳,最好将其外包给仅运行该代码的单独 VM,这样 VM 的暂停时间就不会那么长。或者更好的是,不要依赖毫秒时间——你不能假设桌面操作系统中进程之间的调度级别。

于 2013-09-13T02:09:28.407 回答