【问题标题】:Determine when the Android GC runs确定 Android GC 何时运行
【发布时间】:2010-02-19 18:51:52
【问题描述】:

有谁知道在 GC 运行时是否有办法识别(在代码中,而不是 LogCat)?也许一个意图被解雇了?我可以分析 LogCat 输出,但如果我可以从我的代码中确定 GC 何时运行,那将是理想的选择。

【问题讨论】:

    标签: android garbage-collection


    【解决方案1】:

    您可以使用弱引用技巧来做到这一点:

    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 扩展(实现)什么类(接口)?
    • 啊,没关系,我想我明白了。唉,我属于不理解 WeakReferences 的一类人 :) 我想我理解它是如何工作的。
    • handleGc() 一次又一次地打电话!甚至应用程序正在运行!但我只希望它在垃圾收集上。
    【解决方案2】:

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

    我认为 GC 不会有一个钩子来告诉你它在做什么。您可能必须分配内存才能被告知发生了集合。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多