2010-02-19 3 views
4

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

ответ

7

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

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, например, когда они уходят в фоновый режим.

+0

Спасибо, что выглядит так, как я хочу, я думаю, что мне что-то не хватает, хотя какой класс (интерфейс) выполняет GcWatcher (реализует)? –

+0

Ах, нет, я думаю, я понимаю. Увы, я попадаю в категорию людей, которые не понимают WeakReferences :) Думаю, я понимаю, как это работает. –

-3

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

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

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

Смежные вопросы