在停止World GC期间,是否会停止使用scheduleWithFixedDelay调度的java运行任务?
我想实现一种心跳机制,在这种机制中,子进程将定期ping父进程,以告知父进程它仍然处于活动状态。我使用threadPool的scheduleWithFixedDelay方法以以下方式实现ping任务:在停止World GC期间,是否会停止使用scheduleWithFixedDelay调度的java运行任务?,java,garbage-collection,schedule,Java,Garbage Collection,Schedule,我想实现一种心跳机制,在这种机制中,子进程将定期ping父进程,以告知父进程它仍然处于活动状态。我使用threadPool的scheduleWithFixedDelay方法以以下方式实现ping任务: pingService.scheduleWithFixedDelay(new PingGroomServer(umbilical, taskId), 0, pingPeriod, TimeUnit.MILLISECONDS); RPC客户端到父进程是什么 具有固定延
pingService.scheduleWithFixedDelay(new PingGroomServer(umbilical,
taskId), 0, pingPeriod, TimeUnit.MILLISECONDS);
RPC客户端到父进程是什么
具有固定延迟的scheduleWithFixedDelay是否可以具有固定延迟?在停止World GC期间,ping线程是否会停止?
实际上,即使在我等待6*ping周期ms之后,我仍然错过了心跳。是的,停止世界就是它所说的那样-访问堆上没有特别涉及垃圾收集器的对象的每个线程都被停止
如果您想要java中的心跳信号,最好将其分给一个单独的VM,该VM只运行该代码,这样VM暂停就不会太长。或者更好的是,不要依赖毫秒计时-你不能假设桌面操作系统中进程之间的调度级别。是的,停止世界就是它所说的那样-访问堆上与垃圾收集器无关的对象的每个线程都被停止
如果您想要java中的心跳信号,最好将其分给一个单独的VM,该VM只运行该代码,这样VM暂停就不会太长。或者更好的是,不要依赖毫秒计时-您不能假设桌面操作系统中进程之间的调度级别。因此,在您的应用程序中有几种更确定的运行时选择(Gc暂停、线程调度等)
- 硬件-这是最重要的。您必须有一个具有快速多线程CPU和快速内存模块的SMP系统。避免交换。因此,您拥有的硬件越快,垃圾收集器的执行速度就越快
- 使用多线程垃圾收集器。如果您使用的是Oracle JVM,请选择G1或parallelGC(也称吞吐量收集器)
- 使用小堆,堆越大,垃圾收集器必须处理的空间就越多
- 调整内存(堆)人体工程学。微调内存人体工程学,让对象在年轻一代收集(而不是提升到老一代),以避免完全的垃圾收集李>
因此,在应用程序中有多种选择可用于更具确定性的运行时(Gc暂停、线程退出等)
- 硬件-这是最重要的。您必须有一个具有快速多线程CPU和快速内存模块的SMP系统。避免交换。因此,您拥有的硬件越快,垃圾收集器的执行速度就越快
- 使用多线程垃圾收集器。如果您使用的是Oracle JVM,请选择G1或parallelGC(也称吞吐量收集器)
- 使用小堆,堆越大,垃圾收集器必须处理的空间就越多
- 调整内存(堆)人体工程学。微调内存人体工程学,让对象在年轻一代收集(而不是提升到老一代),以避免完全的垃圾收集李>
是的,停止世界GC确实“停止世界”。即使没有它,我认为这些计时器也不能完全保证准时开火(只是不能在时间之前)。这是个糟糕的问题。不够详细。你错过了所有的心跳还是某些时候?您是否运行了-verbose:gc和一些日志记录,丢失的ping和gc之间是否存在相关性?是的,停止世界gc确实“停止世界”。即使没有它,我认为这些计时器也不能完全保证准时开火(只是不能在时间之前)。这是个糟糕的问题。不够详细。你错过了所有的心跳还是某些时候?您是否运行了-verbose:gc和一些日志记录,丢失的ping和gc之间的相关性如何?