我想实现一种心跳机制,其中子进程会定期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后,我仍然会错过心跳。
答案 0 :(得分:1)
是的,stop-the-world正是它所说的那样 - 每个访问堆上没有特别涉及垃圾收集器的对象的线程都会被停止。
如果您想在java中使用心跳,最好将其分配到仅运行该代码的单独VM,以便VM暂停时间不会太长。或者更好的是,不依赖于毫秒时间 - 您无法假设桌面操作系统中的进程之间的调度级别。
答案 1 :(得分:1)
因此,在应用程序中有更多确定性运行时(Gc暂停,线程调度等)有多种选择
由于上述选择对于小型应用程序来说可能是一个相当大的步骤,因此您可以使用“经典”Java实现来完成这些任务。
因此,如果您希望使用Oracle / OpenJDK JVM进行短暂的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