在分析我的应用程序时,我发现了频繁分配的来源......我正在使用多个计时器来检查超时(约 2 毫秒,随应用程序状态而变化)。
根据this SO answer,ScheduledThreadPoolExecutor
最好是Timer
。因此,我将课程与其他 SO 答案非常相似,该答案按照建议安排任务。我像这样使用它:
private final ResettableTimer timer = new ResettableTimer(new Runnable() {
public void run() {
//timeout, do something
}
});
timer.reset(2, TimeUnit.MILLISECONDS);
我发现每次调度任务时,java都会分配以下内容:
java.util.concurrent.LinkedBlockingQueue$Node
- 16 字节
java.util.concurrent.Executors$RunnableAdapter
- 16 字节
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
- 64 字节
java.util.concurrent.locks.AbstractQueuedSynchronizer$node
- 28 字节
例如:500 个任务/s = 124kB/s 的 2 个定时器
这很小,但会导致非常频繁的垃圾收集。它现在似乎并没有给我带来问题,尽管它可能是我在旧设备上看到的一些口吃的原因。我应该担心吗?
更重要的是,这些分配似乎非常不必要,因为这些任务一遍又一遍地做同样的事情。有什么办法可以避免这种重新分配?