Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定Android GC何时运行_Android_Garbage Collection - Fatal编程技术网

确定Android GC何时运行

确定Android GC何时运行,android,garbage-collection,Android,Garbage Collection,是否有人知道是否有一种方法可以在GC运行时识别(在代码中,而不是在LogCat中)?也许是故意的?我可以分析LogCat输出,但如果我能从我的代码中确定GC何时运行,那就太理想了。垃圾收集器将在所有线程都挂起之前运行。由于手机是内存非常低的环境,因此可以安全地假设GC将在收到onPause()或onStop()后运行 我不认为GC会有一个钩子来告诉你它在做什么。您可能必须分配内存才能被告知发生了一次收集 我很好奇,如果你的程序有这些信息,它会怎么处理 您可以使用弱引用技巧来实现这一点: Weak

是否有人知道是否有一种方法可以在GC运行时识别(在代码中,而不是在LogCat中)?也许是故意的?我可以分析LogCat输出,但如果我能从我的代码中确定GC何时运行,那就太理想了。

垃圾收集器将在所有线程都挂起之前运行。由于手机是内存非常低的环境,因此可以安全地假设GC将在收到onPause()或onStop()后运行

我不认为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());
    }
}
WeakReference mGcWatcher
=新的WeakReference(新的GcWatcher());
时间长;
类观察者{
@凌驾
受保护的void finalize()抛出可丢弃的{
handleGc();
mLastGcTime=SystemClock.uptimeMillis();
mGcWatcher=new WeakReference(new GcWatcher());
}
}

现在。。。应用程序这样做是否真的正确是另一回事。:)据我所知,我们在Android中做这项工作的唯一地方就是这里的代码,它的唯一目的是帮助我们在我们要求进程显式GC时(例如当它们进入后台时)保持明智。

谢谢,这看起来像是我想要的,但我想我遗漏了一些东西,GcWatcher扩展(实现)了什么类(接口)?啊,没关系,我想我明白了。唉,我属于不懂WeakReferences的那类人:)我想我明白这是怎么回事。
handleGc()
一次又一次地调用!甚至应用程序也在运行!但我只想把它用在垃圾收集上。