在使用vertx.setPeriodic
设置计时器的工作人员垂直环境中,假设延迟为100ms
,但处理程序要花费5000ms
,如果应用长时间运行,会发生什么情况时间。会导致内存泄漏问题吗?如果可以,该如何解决内存问题?
vertx.setPeriodic(100, timer -> {
vertx.executeBlocking(future -> {
// here are some blocking code may cause 5000ms to complete the future.
}, res -> {
});
})
答案 0 :(得分:1)
最终是的,它将导致内存问题,因为
由于periodic内部的代码正在executeBlocking
内部执行,因此它将在配置的工作池(具有固定大小)上执行,并且由于未指定order参数,因此每个executeBlocking调用将串行执行(即一个接一个)
由于periodic在事件循环线程上运行,因此它将永远不会等待,并且会在经过修复周期(在您的情况下为100毫秒)后继续触发。
因此,对周期内代码的调用将顺序执行并堆积起来。工作池耗尽后,对executeBlocking的调用将进入等待状态。
处理此问题的几种选择可以是(之一或组合)
false
指定为ordered
的参数。在这种情况下,任何executeBlocking
都可以在工作池上并行执行。