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回收的更多相关文章

  1. OkHttp3源码详解(五) okhttp连接池复用机制

    1.概述 提高网络性能优化,很重要的一点就是降低延迟和提升响应速度. 通常我们在浏览器中发起请求的时候header部分往往是这样的 keep-alive 就是浏览器和服务端之间保持长连接,这个连接是可 ...

  2. 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)

    -----------------------JDBC---------- 0.      db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...

  3. redis连接池的使用方法

    所需jar:jedis-2.8.0.jar和commons-pool-2-2.3jar Jedis操作步骤如下:1->获取Jedis实例需要从JedisPool中获取:2->用完Jedis ...

  4. dbcp连接池的一些方法

    创建连接 // 简写版: Connection conn =null; Statement st =null; conn = DBCP.getConnection(); st=conn.createS ...

  5. jdbc连接MySQL数据库+简单实例(普通JDBC方法实现和连接池方式实现)

    jdbc连接数据库 总结内容 1. 基本概念 jdbc的概念 2. 数据库连接 数据库的连接 DAO层思想 重构设计 3. 事务 概念 事务的ACID属性 事务的操作 4. 连接池 为什么要使用连接池 ...

  6. jdbc连接数据库以及简单实现(普通JDBC方法实现和连接池方式实现)

    @ 目录 总结内容 1. 基本概念 jdbc的概念 2. 数据库连接 数据库的连接 DAO层思想 重构设计 3. 事务 概念 事务的ACID属性 事务的操作 4. 连接池 为什么要使用连接池 连接池分 ...

  7. C3P0连接池配置方式

    c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 1.set ...

  8. Oracle连接池

    原由:许多用户可能在查询相同的数据库以获取相同的数据.在这些情况下,可以通过使应用程序共享到数据源的连接来提高应用程序的性能.否则,让每个用户打开和关闭单独的连接的开销会对应用程序性能产生不利影响.这 ...

  9. JDBC 和连接池

    1 JDBC概述 Java DataBase Connectivity,Java数据库连接,一种执行SQL的Java API,为多种关系数据库提供统一访问规范,由一组Java语言编写的类和接口组成.数 ...

随机推荐

  1. 图像欧拉数计算 matlab实现

    EUL = C - H 其中EUL表示欧拉数  C表示对象数 H表示孔洞数 欧拉数常用来识别数字: 识别数字 8 ,8 的欧拉数为 -1 ,不同于0,1,2,3,4,5,6,7,9 close all ...

  2. 部署zabbix监控平台(源码安装)

    案例:部署Zabbix监控平台 1 问题 本案例要求部署一台Zabbix监控服务器,一台被监控主机,为进一步执行具体的监控任务做准备: 安装LNMP环境 源码安装Zabbix 安装监控端主机,修改基本 ...

  3. 【机器学习】sigmoid函数求导 手写过程

  4. Hbase 学习记录

    说明: 公司最近要使用HBase 用于(冷)历史数据 存储,和简单离线计算.在一次讨论会上,我发表意见,为什么把近期数据流程热点数据库中,并且继续异步流入到 历史数据库HBase 里面.提供高效查询等 ...

  5. 【Qt开发】QT4 升级到 QT5 改动

    QT4 升级到 QT5 改动: PC部分: [改 QTDIR 变量] 在工程根目录下找到 .user 文件 ,  如 InnoTabPlugin.vcxproj.user 修改指向你的 QT5 根目录 ...

  6. jquery(第一章)认识jquery

    Jquery对象就是通过JQuery包装DOM对象后产生的对象,在JQuery对象中无法使用DOM对象的任何方法. 1.4.2 JQuery对象的和DOM对象的互相转换 若获取的对象是JQuery对象 ...

  7. java类和对象详解

    类和对象 java 是面向对象的语言 即 万物皆对象c语言是面向过程语言 一.怎么去描述一个对象? (1)..静态的(短时间内不会改变的东西) 例如:外观,颜色,品牌 (2).动态的(动作) 可以干什 ...

  8. python+selenium+webdriver+BeautifulSoup实现自动登录

    from selenium import webdriverimport timefrom bs4 import BeautifulSoupfrom urllib import requestimpo ...

  9. 用bisect来管理已排序的序列

    bisect 模块包含两个主要函数,bisect 和 insort,两个函数都利用二分查找算法来在有序序列中查找或插入元素. 2.8.1 用bisect来搜索 bisect(haystack, nee ...

  10. 【hash表】门票

    问题 I: [哈希和哈希表]门票 题目描述 RPK要带MSH去一个更加神秘的地方!RPK带着MSH穿过广场,在第1618块砖上按下了一个按钮,在一面墙上随即出现了一个把手.RPK握住把手,打开了一扇石 ...