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

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

  •  
  •   mcj · 2019-01-16 21:33:16 +08:00 · 3758 次点击
    这是一个创建于 1898 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    gam2046
        1
    gam2046  
       2019-01-16 21:40:43 +08:00
    治标不治本的方法:

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