梳理WeakPreference源码20210611

问题

1、堆外内存怎么回收?

使用java的cleaner(实际上是PhantomReference类型),然后标记堆外分配的内存 unsafe.allocateMemory(size);,

然后当需要释放的是,cleaner会回调堆外内存,然后调用unsafe.freeMemory释放

2、引用类型是怎么判断有没释放?

在初始化的时候会传入一个queue,从queue中如果能找到这个数据,则说明回收了


-------------------------------------------------------------------------------

java1.8和android26中关于WeakPreference的内容是不一样的


WeakReference(T referent, ReferenceQueue q) 

构造方法有一个队列,这个队列是用来存储等待释放的对象

在gc后会释放该对象

------------------------------------------------------------------java1.8版本

1、继承自Reference

有四种状态active,pending(注册过的),enqueued,Inactive(引用没有注册)

-------------------------------------------------------------------------------

2、这个类有一个static的守护线程

handler.setPriority(Thread.MAX_PRIORITY);

handler.setDaemon(true);

handler.start();

在run方法中一直while不停的,一直处理等待的引用

while (true) {

tryHandlePending(true);

}

-------------------------------------------------------------------------------

3、在tryHandlePending(true);方法中

最终释放的引用会入队列



-------------------------------------------------------------------------------android26的版本

1、软用用,弱引用,虚引用都有一个queue判断队列是否回收

2、弱引用

timestamp  clock会赋值给它

clock记录gc调用的时间

gc每次都会更新timestamp的时间

你可能感兴趣的:(梳理WeakPreference源码20210611)