okhttp连接池:put,get方法&connection回收
OkHttp连接池put和get方法:
在上一次【https://www.cnblogs.com/webor2006/p/9281429.html】咱们分析了连接拦截器,如下:

不管是Http1.0还是Http2.0,它们的keep-alive机制或者Http2.0的多路复用机制在实现上都需要引入一个连接池的概念,来维护OkHttp的网络连接,而在OkHttp将客户端与服务器的连接抽象成了一个叫Connection的抽象接口,如下:

而它的具体实现类为RealConnection类,如下:

而为了管理所有的Connection,Okhttp设计了连接池:ConnectionPool,如下:

也就是该连接池的作用就是在一定时间范围之内复用连接,先来看一下它里面提供的put和get方法,如下:

先来看一下它的get方法是如何从连接池中来得到一个复用的连接对象的:

实现代码比较短,下面具体来看一下:

如果满足条件,则会获取连接,如下:

那具体是如何acquire()的呢?


而看一下allocations又是个什么变量:

那有啥用呢?其实这个变量是为了看一个网络连接它的负载量是否超过了它的最大值判断而用的。
回到主流程:

接下来看一下put方法,其实它更加简单,如下:

其中connections是一个队列,如下:

下面总结一下关于连接的东东:
1、首先会在重试拦截器中产生一个StreamAllocation对象,如下:

2、StreamAllocation对象的弱引用添加到RealConnection对象的allocations集合中:

3、从链接池中获取相应连接。
OkHttp连接池connection回改:
对于连接池肯定有一个自动清理的机制,不可能无限可以往池中添加连接对象,而在上面的put方法中其实就已经看到有一个清理线程了,如下:

所以接下来就分析一下该清理线程如何实现的:


好,重点就是看如何进行清理的,点进去看一下:

实际上它是采用的GC标记清除算法,先标记出最不活跃的连接,然后将其清理出去,下面看这块的核心代码:

那是如何标记最不活跃的连接的呢?



接着就根据遍历的结果进行清除处理,继续往下看:




此时回到主流程就会退出了,如下:

总结一下:
1、okHttp使用了GC回收算法。
2、StreamAllocation的数量会渐渐变成0。
3、被线程池监测到并回收,这样就可以保持多个健康的keep-alive连接。
okhttp连接池:put,get方法&connection回收的更多相关文章
- OkHttp3源码详解(五) okhttp连接池复用机制
1.概述 提高网络性能优化,很重要的一点就是降低延迟和提升响应速度. 通常我们在浏览器中发起请求的时候header部分往往是这样的 keep-alive 就是浏览器和服务端之间保持长连接,这个连接是可 ...
- 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)
-----------------------JDBC---------- 0. db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...
- redis连接池的使用方法
所需jar:jedis-2.8.0.jar和commons-pool-2-2.3jar Jedis操作步骤如下:1->获取Jedis实例需要从JedisPool中获取:2->用完Jedis ...
- dbcp连接池的一些方法
创建连接 // 简写版: Connection conn =null; Statement st =null; conn = DBCP.getConnection(); st=conn.createS ...
- jdbc连接MySQL数据库+简单实例(普通JDBC方法实现和连接池方式实现)
jdbc连接数据库 总结内容 1. 基本概念 jdbc的概念 2. 数据库连接 数据库的连接 DAO层思想 重构设计 3. 事务 概念 事务的ACID属性 事务的操作 4. 连接池 为什么要使用连接池 ...
- jdbc连接数据库以及简单实现(普通JDBC方法实现和连接池方式实现)
@ 目录 总结内容 1. 基本概念 jdbc的概念 2. 数据库连接 数据库的连接 DAO层思想 重构设计 3. 事务 概念 事务的ACID属性 事务的操作 4. 连接池 为什么要使用连接池 连接池分 ...
- C3P0连接池配置方式
c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 1.set ...
- Oracle连接池
原由:许多用户可能在查询相同的数据库以获取相同的数据.在这些情况下,可以通过使应用程序共享到数据源的连接来提高应用程序的性能.否则,让每个用户打开和关闭单独的连接的开销会对应用程序性能产生不利影响.这 ...
- JDBC 和连接池
1 JDBC概述 Java DataBase Connectivity,Java数据库连接,一种执行SQL的Java API,为多种关系数据库提供统一访问规范,由一组Java语言编写的类和接口组成.数 ...
随机推荐
- hadoop java VM 参数设置 默认native栈大小设置
问题总结: 程序栈太小,64位机器的栈大小默认比32位的大,将程序从64放到32中执行则报错,需要修改初始堆栈大小 (.so库中提供两个函数接口,一个里面使用的是尺寸较大的图像,另一个处理的图像很小, ...
- YUV RGB 格式转换
第一个公式是RGB转YUV(范围0-255)时用的,第二个公式是用在YUV转换RGB(范围0-255)时用的.1. Y = ; U = -; V = ; 黑色:Y=16 ,U= V =128 红色:Y ...
- Python安装pip3
在新的电脑上,偶尔会出现无法安装pip的问题. 今天看见了一位大神的方法: 在cmd窗口中输入python -m ensurepip 然后使用pip命令安装其他包.pip3 install 模块名 说 ...
- .Net WebApi接口之Swagger UI 隐藏指定接口类或方法
swagger的一个最大的优点是能实时同步api与文档,但有些时候我们不想全部公开接口,而要隐藏或屏蔽一些接口类或方法,swagger也是支持的,只需要设置一下DocumentFilter方法. 第一 ...
- vue加载优化方案
我们的项目随着组件的加入,首次加载的js文件越来越大,用户等待时间越来越长:之前想着使用webpack的splitCoding来解决,看了webpack的官方文档可以配置optimization的 m ...
- 记录下为了玩 docker 安装 CentOS 7 最简化版后遇到的一些问题
今天我的腾讯云服务器在使用docker安装ElasticSearch和Kibana的时候内存不够,安装完直接卡死.所以无奈只能在本地上跑VMWare安装CentOS7来运行测试. 从阿里云镜像地址:h ...
- 浅谈>/dev/null 2>&1
在crond计划任务.nohup中我们经常可以看到>/dev/null 2>&1,但是很多人并不理解其含义,想要真正的理解它,首先我们需要知道文件描述符的三种类型. 类型 文件描述 ...
- HTTP用户认证、追加协议以及相关技术简单学习
1. 用户身份认证 BASIC认证(基本认证): DIGEST(摘要认证): SSL客户端认证: FormBase认证(表单认证)常用: session和cookie 2. 基于HTTP的追加协议 A ...
- 关于springboot的日志logging.file和logging.path的配置问题
springboot日志配置 logging.path logging.file 它们俩不会同时生效,so只配置其中一个就好了. eg1: 单独一个path配置 logging.path=E:/lo ...
- 使用JavaScript随机生成数字混合字母的验证码
<script> // 封装一个随机生成数字的函数 function random(a, b) { var n = Math.round(Math.random() * (a - b) ...