1

アプリのプロファイリング中に、頻繁な割り当ての原因が見つかりました... 複数のタイマーを利用してタイムアウトをチェックしています (~2ms、アプリの状態によって異なります)。

この 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 タスク/秒で 2 つのタイマー = 124kB/秒

これは小さいですが、非常に頻繁にガベージ コレクションが発生します。古いデバイスで見られる吃音の原因かもしれませんが、今のところ問題を引き起こしているようには見えません. 私は心配する必要がありますか?

さらに重要なことに、これらのタスクは同じことを何度も繰り返しているため、これらの割り当てはかなり不必要に思えます。この再割り当てを回避する方法はありますか?

4

0 に答える 0