【发布时间】:2010-02-19 18:51:52
【问题描述】:
有谁知道在 GC 运行时是否有办法识别(在代码中,而不是 LogCat)?也许一个意图被解雇了?我可以分析 LogCat 输出,但如果我可以从我的代码中确定 GC 何时运行,那将是理想的选择。
【问题讨论】:
标签: android garbage-collection
有谁知道在 GC 运行时是否有办法识别(在代码中,而不是 LogCat)?也许一个意图被解雇了?我可以分析 LogCat 输出,但如果我可以从我的代码中确定 GC 何时运行,那将是理想的选择。
【问题讨论】:
标签: android garbage-collection
您可以使用弱引用技巧来做到这一点:
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 时(例如当它们进入后台时)变得聪明。
【讨论】:
handleGc() 一次又一次地打电话!甚至应用程序正在运行!但我只希望它在垃圾收集上。
在所有线程都挂起之前,垃圾收集器不会运行。由于手机是非常低内存的环境,因此可以安全地假设在您收到 onPause() 或 onStop() 后 GC 将运行。
我认为 GC 不会有一个钩子来告诉你它在做什么。您可能必须分配内存才能被告知发生了集合。
我很好奇,如果你的程序有这些信息,它会用它做什么?
【讨论】: