来自王老板的分享
OKHTTP系统架构模型
线程池
连接池(ConnectionPool)
思考
概述
如何创建
如何管理
如何回收
要解决的问题
连接池上限
什么时候释放哪些连接
有链接超时的情况
学习
协议
- HTTP 1.0
- HTTP 1.1
- HTTP 2
- SPDY 3.1
- QUIK (Quick UDP Internet Connection)
创建
put新连接
- 先检查空闲连接,将其清理
- 放入新的连接
1
2
3
4
5
6
7
8void put(RealConnection connection) {
assert (Thread.holdsLock(this));
if (!cleanupRunning) {
cleanupRunning = true;
executor.execute(cleanupRunnable);
}
connections.add(connection);
}
1 | private final Runnable cleanupRunnable = new Runnable() { |
清理
如何找到闲置的连接
- 通过
pruneAndGetAllocationCount(connection, now)
判断当前连接是不是在用 - 当
idleDurationNs
纳秒数超过keepAliveDurationNs
或者idleConnectionCount
超过maxIdleConnections
时,直接将当前连接移除 - 上面情况不满足时,当
idleConnectionCount > 0
返回允许等待的时间差值 - 当
inUseConnectionCount > 0
返回keepAlive的最大时间 - 当前无连接不需要清理
如何判断连接是否在用
- 主要检查
Reference
的StreamAllocation
是否为空,为空则说明有连接泄漏,程序有异常,不为空则返回Reference
的列表size