アプリのプロファイリング中に、頻繁な割り当ての原因が見つかりました... 複数のタイマーを利用してタイムアウトをチェックしています (~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/秒
これは小さいですが、非常に頻繁にガベージ コレクションが発生します。古いデバイスで見られる吃音の原因かもしれませんが、今のところ問題を引き起こしているようには見えません. 私は心配する必要がありますか?
さらに重要なことに、これらのタスクは同じことを何度も繰り返しているため、これらの割り当てはかなり不必要に思えます。この再割り当てを回避する方法はありますか?