Определите, когда запускается Android GC

Кто-нибудь знает, есть ли способ идентифицировать (в коде, а не LogCat), когда GC запущен? Возможно, намерение уволено? Я мог бы анализировать вывод LogCat, но это было бы идеально, если бы я мог определить, когда GC запущен из моего кода.

Вы можете сделать это со слабым опорным трюком:

WeakReference<GcWatcher> mGcWatcher = new WeakReference<GcWatcher>(new GcWatcher()); long mLastGcTime; class GcWatcher { @Override protected void finalize() throws Throwable { handleGc(); mLastGcTime = SystemClock.uptimeMillis(); mGcWatcher = new WeakReference<GcWatcher>(new GcWatcher()); } } 

Теперь … действительно ли это правильно для приложения, чтобы сделать это, это другое. 🙂 Единственное место, где я знаю, где бы мы ни делали это в Android, – это код здесь, и его единственная цель – помочь нам быть умными, когда мы просим процессы явно использовать GC, например, когда они уходят в фоновый режим.

Сборщик мусора не будет работать, пока все ваши потоки не будут приостановлены. Поскольку телефоны имеют довольно низкую память, вероятно, можно предположить, что GC будет запущен после того, как вы получите onPause () или onStop ().

Я не думаю, что у GC будет крючок, чтобы рассказать вам, что он делает. Вам, вероятно, придется выделить память, чтобы сказать, что коллекция произошла.

Мне любопытно, если бы у вашей программы была эта информация, что бы она сделала с ней?