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、