1

在分析我的应用程序时,我发现了频繁分配的来源......我正在使用多个计时器来检查超时(约 2 毫秒,随应用程序状态而变化)。

根据this SO answerScheduledThreadPoolExecutor最好是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 个定时器

这很小,但会导致非常频繁的垃圾收集。它现在似乎并没有给我带来问题,尽管它可能是我在旧设备上看到的一些口吃的原因。我应该担心吗?

更重要的是,这些分配似乎非常不必要,因为这些任务一遍又一遍地做同样的事情。有什么办法可以避免这种重新分配?

4

0 回答 0