首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Android

遇到关于 ART 的内存回收的一个棘手问题, Activity 对象已经不可达,但在有些机型上 GC 并不会回收它?

  •  
  •   mcj · 32 天前 · 746 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.多发于高版本机型上,目前来看是 8.0 以后才会出现 2.在表现正常的机型上,Activity 退出就能回收掉。 3.leakCanary 没有报内存泄漏。 4.进出该 Activity 多次,heap dump 出来看到所有该 Activity 的实例的 shallow size 和 retained size 已经一样,只有几百 b 大小,但是不管多少次 GC 都不会回收掉,堆得越来越多。

    有什么思路吗?

    5 回复  |  直到 2019-01-18 16:35:47 +08:00
        1
    gam2046   32 天前
    治标不治本的方法:

    1、Process.kill(...) 自杀所有进程
    2、PendingIntent 计划 500ms 后重启应用
        2
    nicevar   32 天前
    在 8.1.0 的系统上也遇到类似的问题,我发现的情况是触发之后所有的应用都会出现,直到手机报内存不足然后卡顿得不行,需要强行停止,没救,问题不在应用上,是系统的锅
        3
    mcj   31 天前
    @nicevar 经过反复注释掉代码,隐约感觉和 fragment 的一些回收有关系,可能某部分代码刚好触发了底层一些不回收的逻辑,但是要排查出到底是什么原因很麻烦。pixel 2 也会出现这个问题,很有可能是 google 的锅。。。。
        4
    zhujinlong   31 天前
    既然已经 dump heap,快用 MAT 看下 Activity 被谁持有了强引用,我怀疑你的判断“ Activity 对象已经不可达”并不正确。
        5
    mcj   30 天前
    @zhujinlong 没有被持有强引用,且 8.0 以下版本一切正常,回收迅速,Leakcanary 中认为其“没有能达到 GC ROOT 的路径”所以不会报告。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1096 人在线   最高记录 4346   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 15ms · UTC 23:46 · PVG 07:46 · LAX 15:46 · JFK 18:46
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1