确定Android垃圾回收器何时运行

4

有没有办法在代码中(而不是LogCat中)识别GC何时运行?也许会触发一个意图?我可以分析LogCat输出,但如果能够从我的代码确定GC何时运行,那就更理想了。

2个回答

9
你可以使用弱引用技巧来实现这一点:
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时的情况,例如当它们进入后台时。


谢谢,看起来就是我想要的,不过我觉得我还缺少一些东西,GcWatcher继承(实现)哪个类(接口)? - Chris Thompson
啊,算了吧,我想我明白了。唉,可惜,我属于那些不理解弱引用的人 :) 我想我懂这是怎么回事了。 - Chris Thompson
handleGc()会一遍又一遍地调用!即使应用程序正在运行!但我只想在垃圾回收时调用它。 - Dr.jacky

-3

垃圾回收器在所有线程都暂停之前不会运行。由于手机内存通常较低,因此可以安全地假设在接收到onPause()或onStop()后GC将运行。

我认为GC没有钩子告诉你它在做什么。您可能需要分配内存以获知发生了收集。

我很好奇,如果您的程序有这些信息,它会怎么做?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接