在使用 vertx.setPeriodic
设置计时器的工作 verticle 中,假设延迟为 100ms
,但处理程序需要 5000ms
才能完成,如果应用程序运行很长时间会发生什么。会导致内存泄漏问题吗?如果是这样,如何解决内存问题?
vertx.setPeriodic(100, timer -> {
vertx.executeBlocking(future -> {
// here are some blocking code may cause 5000ms to complete the future.
}, res -> {
});
})
最佳答案
最终是的,它会导致内存问题,因为,
由于 period 内的代码在 executeBlocking
内执行,它将在配置的工作池(具有固定大小)上执行,并且由于未指定 order 参数,因此每个executeBlocking 调用将串行执行(即一个一个接一个)。
由于周期性在事件循环线程上运行,因此它永远不会等待,并将在传递给它的修复周期后继续触发(在您的情况下为 100 毫秒)。
因此,对周期内代码的调用将串行执行并堆积起来。一旦工作池耗尽,对executeBlocking的调用将进入等待状态。
处理此问题的几种选择可以是(其中之一或组合),
- 有单独的周期性 Worker verticle。
- 按专用于周期的名称定义单独的工作池。
- 根据运行定期作业所需的平均时间微调定期频率。
- 如果您不关心排序,则可以调用executeBlocking,并将
false
指定为ordered
的参数。在这种情况下,任何executeBlocking
都可以在工作池上并行执行。
关于java - 如果 vertx setPeriodic 延迟小于其处理程序执行时间会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830841/