在分析我的应用程序时,我找到了频繁分配的来源...我正在使用多个计时器来检查超时(约2毫秒,因应用程序状态而异)。
根据this SO answer,ScheduledThreadPoolExecutor
优于Timer
。因此,我使类与this other SO answer非常相似,按照建议安排任务。我这样使用它:
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个字节
例如:2个定时器,500个任务/秒= 124kB / s
这很小,但它会导致非常频繁的垃圾收集。它现在似乎没有引起我的问题,虽然它可能是我在旧设备上看到的一些口吃的原因。我应该担心吗?
更重要的是,这些分配看起来非常不必要,因为这些任务在&再次。有没有办法避免这种重新分配?