监听应用是否发生GC

1.回顾java的几种引用方式

我们先回顾下java中的引用方式:

  • 强引用 java中普遍存在的引用方式,比如 Object object = new Object();,

只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象

  • 弱引用 private WeakReference<GCOwer> rf = new WeakReference<>(new GCOwer());

只用发生gc就会立马回收

  • 软引用 private SoftReference<GCOwer> rf2 = new SoftReference<>(new GCOwer());

只有内存不足时,major gc才能回收

综上所述,由于弱引用不管内存足不足,只要发生gc就会回收,利用此特性我们就可以监听应用是否发生了gc。

2.弱引用监听GC:

public class GCCheck {
    private WeakReference<GCOwer> rf = new WeakReference<>(new GCOwer());


    public class GCOwer {


        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            Log.i("GCCheck", "finalize: app gc occur");


            rf = new WeakReference<>(new GCOwer());
        }
    }
}

我们手动构造了一个弱引用实例WeakReference,持有GCOwer对象;

然后我们重写GCOwer类的finalize()方法;

一旦发生GC就会触发WeakReference持有的GCOwer对象被回收,GCOwer被回收的时候,就会触发其方法finalize()的调用,我们就可以在该方法中统计gc执行的频率。

需要注意的是,在finalize()中我们需要重新实例化一个WeakReference<GCOwer>并赋值给rf,这是因为之前的弱引用已经被回收,如果要继续监听gc就需要重新创建一个WeakReference<GCOwer>的弱引用实例

3.实战测试

定义一个类,里面分配一个足够的大的1000 * 10000的数组:

class Dump1 {
    val data = Array(1000 * 10000) {
        return@Array "$it".repeat(10)
    }
}

然后再ActivityonCreate中调用:

override fun onCreate(savedInstanceState: Bundle?) {  
    val dump1 = Dump1()
}

这个时候看下logcat信息:1d7d48cbd33cc31cfb60974de081d1e0.png

可以看到,GCOwer类的finalize()方法中疯狂的输出日志,这就代表着应用频繁发生了gc。

4.Android源码中的应用

073065e4f181ffacc8e9c77cb90eb4b4.png然后再ActivityThread中会调用:

58c317c4a926d1913649e23e74783a3b.png

通过BinderInternal利用弱引用实现了GC的监听,ActivityThread添加GC监听回调,来处理当内存达到一定阈值后且符合其他一系列条件,执行Activity回收等相关逻辑。


作者:长安皈故里
链接:https://juejin.cn/post/7083637863341883400

关注我获取更多知识或者投稿

460fdb4ba8ba189597c0b330b1773b1b.png

125c03e6a7c87ead9a2114786f6cb40a.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值