Jaqen's Blog

Jaqen's Blog

OkHttp 源码分析(三):连接机制
前面两篇文章分别介绍了 OkHttp 的请求流程和缓存机制,最后这篇文章介绍 OkHttp 的连接机制,作为 OkHttp 源码分析的收尾。 建议将 OkHttp 的源码下载下来,使用 IDEA 编辑器可以直接打开阅读。我这边也将最新版的源码下载下来,进行了注释说明,有需要的可以直接从 这里 下载查看。 创建连接OkHttp 连接的创建是通过 StreamAllocation 对象统筹完成。 它主要用来管理两个角色: RealConnection:真正建立连接的对象,利用 Socket 建立连接。 ConnectionPool:连接池,用来管理和复用连接。 StreamAlloca...
OkHttp 源码分析(二):缓存机制
上一篇文章我们主要介绍了 OkHttp 的请求流程,这篇文章讲解一下 OkHttp 的缓存机制。 建议将 OkHttp 的源码下载下来,使用 IDEA 编辑器可以直接打开阅读。我这边也将最新版的源码下载下来,进行了注释说明,有需要的可以直接从 这里 下载查看。 在网络请求的过程中,一般都会使用到缓存,缓存的意义在于,对于客户端来说,使用缓存数据能够缩短页面展示数据的时间,优化用户体验,同时降低请求网络数据的频率,避免流量浪费。对于服务端来说,使用缓存能够分解一部分服务端的压力。 在讲解 OkHttp 的缓存机制之前,先了解下 Http 的缓存理论知识,这是实现 OkHttp 缓存的基...
OkHttp 源码分析(一):请求流程
这篇文章主要梳理一下 OkHttp 的请求流程,对 OkHttp 的实现原理有个整体的把握,再深入细节的实现会更加容易。 建议将 OkHttp 的源码下载下来,使用 IDEA 编辑器可以直接打开阅读。我这边也将最新版的源码下载下来,进行了注释说明,有需要的可以直接从 这里 下载查看。 基本使用我们先看一下 OkHttp 的基本使用。 12345678910111213141516171819202122232425262728293031// 1、创建 RequestRequest request = new Request.Builder() .get() .url("x...
科学上网 Vultr 搭建 SS 方法
前几天,搬瓦工服务器到期了。准备再买的,但是最近搬瓦工被封的比较频繁,加上价格越来越高,想换一家试试,所以就找到了 vultr。 这里备忘一些 ss 连接服务器的命令。注册账户、购买、部署服务器步骤省略。 点击 官网地址 。 window 下需安装 git。 git 命令行输入: 1ssh root@45.76.111.96 接着输入密码(服务器密码,图中红框)。 12345wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsock...
Java 内部类总结
Java 中,可以将一个类定义在另一个类或者一个方法里面,这样的类称为内部类。 一般包含四种内部类:成员内部类、匿名内部类、局部内部类和静态内部类。 成员内部类成员内部类的定义位于另一个类的内部,形式如下: 1234567891011121314151617181920public class Outer { private String name; class Inner { Inner(){ name = "wuzy"; } private void displayNa...
Java 类加载器
类的生命周期包含七个阶段: 加载、验证、准备、解析、初始化、使用、卸载。 验证、准备、解析三个阶段统称为连接。 加载、验证、准备、初始化和卸载的顺序是确定的,解析和初始化的前后顺序不一定,主要是为了实现动态绑定。 类加载过程类加载过程主要包含加载、验证、准备、解析和初始化这 5 个阶段。 加载加载是类加载的第一个阶段,注意不要混淆。 加载过程要完成的三件事情: 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口...
理解 ThreadLocal
ThreadLocal 是什么ThreadLocal 提供了线程局部变量。它和普通变量的区别在于,普通变量可以被任何一个线程访问并修改,而使用 ThreadLocal 创建的变量只能被当前线程访问,也就是线程私有,其他线程无法访问和修改。 ThreadLocal 用法创建: 1ThreadLocal<Boolean> threadLocal = new ThreadLocal<>(); set 方法: 1threadLocal.set(false); get 方法: 1threadLocal.get() 我们来看一个完整的示例: 12345678910111213...
Java 内存分配和回收策略
Java 的内存分配主要是在程序运行时给对象在堆上分配内存。通常将堆内存结构按新生代和老年代进行划分,堆内存结构图如下: 新生代大部分对象创建和销毁的区域。 内部包含 Eden 区域,作为对象初始分配的区域;两个 Survivor,也叫 from、to 区域,用来放置从 Minor GC 中生存下来的对象。 TLAB 对 Eden 区域再进行划分, Hotspot JVM 还有一个概念叫着 Thread Local Allocation(TLAB),这是 JVM 为每个线程分配的一个私有缓存区域。多线程同时分配内存时,为了避免操作同一地址,可能需要使用加锁机制,进而影响分配速度。TLA...
JVM 安全点介绍
什么是安全点?在 JVM 中如何判断对象可以被回收 一文中,我们知道 HotSpot 虚拟机采取的是可达性分析算法。即通过 GC Roots 枚举判定待回收的对象。 那么,首先要找到哪些是 GC Roots。 有两种查找 GC Roots 的方法: 一种是遍历方法区和栈区查找(保守式 GC)。 一种是通过 OopMap 数据结构来记录 GC Roots 的位置(准确式 GC)。 很明显,保守式 GC 的成本太高。准确式 GC 的优点就是能够让虚拟机快速定位到 GC Roots。 对应 OopMap 的位置即可作为一个安全点(Safe Point)。 在执行 GC 操作时,所有的工作线程必...
JVM 七种垃圾收集器
Java 垃圾收集器是 垃圾收集算法 的具体实现。 下图展示的是 7 种作用于不同分代的收集器,如果两种收集器之前有连接,表示它们可以配合使用。收集器所在的位置表示它是属于新生代收集器还是老年代收集器。 Serial 收集器单线程、串行收集器。即在垃圾清理时,必须暂停其他所有工作线程。 它是采用复制算法的新生代收集器。 下图是 Serial 收集器的运行过程。 ParNew 收集器ParNew 收集器是 Serial 收集器的多线程版本。除了使用多线程收集,其他与 Serial 收集相比并无太多创新之处。 默认开启的线程数量与 CPU 数量相同。 在单 CPU 的环境,ParNew ...
avatar
Jaqen Ng