okhttp网络框架源码解析十五okhttp框架连接池connection回收

241 篇文章 5 订阅

1、

connection如何在指定的时间内失效,对它进行有效的连接以及清除,这些作用都是非常重要的

连接池的回收利用了Gc的回收算法

streamAllocation的数量会间接地变为0,当它变为0的时候会被线程池检测到,然后回收

在connectionPool当中,有一个独立的线程会开启cleanUpRunnable

2、

 

cleanupRunnable是一个死循环,死循环的意思是它会阻塞在这里,

60行有一个long值,首次清理的时候会返回下次清理的间隔时间。cleanUp()方法里就是执行的具体的gc回收算法

67行调用wait()方法,进行等待,等待释放锁和时间片,当等待时间过了以后会再次调用runnable进行清理,同时会返回下次要清理的间隔时间waitNanos

3、

 

这个清理算法就类似于java gc中的标记清理算法,标记清除就是首先要标记出那些最不活跃的connection连接,其实还可以把这些连接称为泄露连接、idle空闲连接。

同步代码块中的for循环,遍历队列中所有的realConnection,标记泄露的连接,然后进行依次的判断。

226行,判断被标记的空闲连接如果大于5或者,那么就将它从连接中删除并关闭连接。

231行,如果空闲连接数大于0,就会返回默认的keepAliveDurationsNs-longestIdleDurations的值,也就是5分钟后会再次执行清理的工作,234行,就是说变量大于0了,就是正在使用的数量大于0,就是说目前还可以塞下连接,就直接返回keepAliveDurationsNs的连接时间供下次清理使用。

240行,如果没有任何连接的情况下,就返回-1,跳出这个清理死循环。

 

4、如何找到最不活跃的连接?

 

根据弱引用是否为null来判断的。

258行根据streamAllocation的弱引用来判断。

遍历弱引用列表。261行判断这个弱引用是否为空,因为前面线程池中是可以手动控制的,如果为空,就说明没有代码使用这个对象了,continue。

 

273行通过remove()方法移除一个连接

 

277行,当reference为空的时候,就说明维护的整个streamAllocation删空了,这时候就返回0,表示这个连接也没有代码引用了。否则返回一个非0的值,reference.size().

不管哪个方法,都用到了streamAllocation这个最关键的对象。

5、

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值