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. django 之(四) --- 级联|截流

    登陆注册 登陆注册实现 settings.py # redis配置 CACHES = { "default": { "BACKEND": "djang ...

  2. 鸟哥私房菜基础篇:程序管理与 SELinux 初探习题

    猫宁!!! 参考:http://cn.linux.vbird.org/linux_basic/0440processcontrol.php 1-简单说明什么是程序 (program) 而什么是程序 ( ...

  3. 【VS开发】获取CPU tick tick 周期

    多核处理器时,__rdtsc()的使用-编程珠玑第一章 根据书中提供的代码清单1-5,可以完成对于多核处理器的cpu占用率的控制. 但是在使用GetCPUTickCount计时时,下面的算式会出现一点 ...

  4. 最新 房多多java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.房多多等10家互联网公司的校招Offer,因为某些自身原因最终选择了房多多.6.7月主要是做系统复习.项目复盘.LeetCo ...

  5. kafka server.properties 配置文件详解(二)

    虽然在前面一部分我们启动了kafka集群,并通过控制台的方式实现了producer和consumer,但是我们还是了解一下kafka单个节点是的配置参数属性, 也只有了解了这些参数的配置,才能将kaf ...

  6. [转帖]centos7设置CPU的运行频率为performance

    centos7设置CPU的运行频率为performance http://www.512873.com/archives/612.html Publish: March 6, 2019 Categor ...

  7. 【AtCoder】AGC006

    AGC006 A - Prefix and Suffix -- #include <bits/stdc++.h> #define fi first #define se second #d ...

  8. Laravel 最佳实践

    单一职责原则 一个类和一个方法应该只有一个责任. 例如: public function getFullNameAttribute() { if (auth()->user() &&am ...

  9. 怎样通过id属性值获取元素节点

    方法1: 使用document.getElementById(); 方法2: 使用document.querySelector(); document.getElementById("app ...

  10. MongoDB实战读书笔记(一):JavaScript shell操作MongoDB

    1 基本增删改查 基本概念: 数据库:同关系型数据库 集合:类似关系型数据库的表 文档:类似关系型数据库的行 字段:类似关系型数据库的列 操作: insert:新增,若新增数据的主键已经存在,则会抛异 ...