- 博客(21)
- 收藏
- 关注
原创 浅谈 JVM GC 的安全点与安全区域
HotSpot 使用 OopMap 把引用类型的指针记录下来,让 GC Roots 的枚举变得快速准确。为了减少更新 OopMap 的开销,引入了 安全点。GC STW 时,线程需要跑到距离自己最近的安全点,更新完 OopMap 才能挂起。处于Sleep 或者 Blocked 状态的线程无法跑到安全点,需要引入安全区域。GC 的时候,不会去管处于安全区域的线程,线程离开安全区域的时候,如果处于 STW 则需要等待直至恢复。
2021-09-12 18:13:13
805
原创 哦?原来这就是 JVM 垃圾!
什么是垃圾:没有任何引用指向的一个或多个对象。如何识别垃圾,有两种算法:1. 引用计数法:通过给对象添加被引用的次数来识别。优点是回收简单及时;缺点是无法解决循环引用。2. 可达性分析法:从一系列根对象(GC Roots)开始,根据引用关系向下搜索,如果某个对象到 GC Roots 间没有任何引用,则此对象就是垃圾。优点是解决了循环引用;缺点是耗时和 STW。
2021-09-11 17:43:45
181
原创 从零开始实现简单 RPC 框架 9:网络通信之心跳与重连机制
心跳是用于服务端和客户端保持有效连接的一种手段,客户端每隔一小段时间发一个心跳包,以告知服务端其在线。重连机制是连接断开之后,要使用的时候自动重连的机制。心跳和重连机制,结合起来让服务端和客户端的连接使用更加合理,该断开的断开节省服务端资源,该重连的重连提高可用性。
2021-09-07 08:57:02
819
原创 从零开始实现简单 RPC 框架 8:网络通信之 Request-Response 模型
Netty 在服务端与客户端的网络通信中,使用的是异步双向通信(双工)的方式,即客户端和服务端可以相互主动发请求给对方,发消息后不会同步等响应。这样就会有一下问题:1. 如何识别消息是请求还是响应?2. 请求如何正确对应到响应?
2021-09-06 09:08:49
619
原创 从零开始实现简单 RPC 框架 7:网络通信之自定义协议(粘包拆包、编解码)
TCP 是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP 作为传输层协议,并不了解上层业务数据的具体含义,它会根据 TCP 缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整包的,可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 拆包和粘包问题。那么如何解决粘包拆包问题呢?
2021-09-05 15:11:30
700
原创 从零开始实现简单 RPC 框架 6:网络通信之 Netty
ccx-rpc 选择的网络框架是 Netty,Netty 是一款大名鼎鼎的异步事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。
2021-09-03 22:31:06
281
原创 从零开始实现简单 RPC 框架 5:网络通信之序列化
从现在开始,我们要开始讲网络通信相关的内容了。既然是网络通信,那必然会涉及到序列化的相关技术。序列化器的定义,很简单,只有序列化,反序列化两个方法。常见的序列化算法有:Java 序列化、FastJson、Jackson、Kryo、Hessian、Protobuf 等。这些算法各有优缺点,大家在使用时,可以结合自己的业务情况进行选择。
2021-08-27 10:09:45
204
原创 从零开始实现简单 RPC 框架 4:注册中心
RPC 中 Consumer 需要请求 Provider 的接口,必须要知道 Provider 的地址才能请求到。那么,Consumer 要从哪里获取 Provider 的地址呢?答案是:注册中心
2021-08-24 21:58:51
630
原创 从零开始实现简单 RPC 框架 3:配置总线 URL
URL 可以理解为配置总线,所有扩展点参数都包含 URL 参数,URL 作为上下文信息贯穿整个扩展点设计体系。
2021-08-22 10:08:30
750
原创 从零开始实现简单 RPC 框架 2:扩展利器 SPI
RPC 框架有很多可扩展的地方,最好的做法就是留下扩展点,让使用者可以不需要修改框架,就能自己去实现扩展。JDK 原生已经为我们提供了 SPI 机制,ccx-rpc 在此基础上,进行了性能优化和功能增强。
2021-08-15 16:23:41
384
原创 从零开始实现简单 RPC 框架 1:RPC 框架的结构和设计
RPC 框架是后端攻城狮永远都绕不开的知识点,本系列 "造轮子系列之RPC",手把手教大家如何打造自己的RPC框架。
2021-08-08 21:29:04
737
原创 Redis 源码解析 7:五大数据类型之列表
列表对象有 3 种编码:ziplist、linkedlist、quicklist。ziplist 和 linkedlist 是 3.2 版本之前的编码。quicklist 是 3.2 版本新增的编码,ziplist 和 linkedlist 在 3.2 版本及后续版本将不再是列表对象的编码。
2020-12-31 13:00:32
115
原创 Redis 源码解析 6:五大数据类型之字符串
字符串的编码有raw、embstr、int三种。raw 用于长字符串。embstr 用于短字符串。int 用于整数类型。
2020-12-29 00:13:42
226
原创 Redis 源码解析 5:压缩列表 ziplist
压缩列表是 ZSEt、Hash 和 List 类型的其中一种编码的底层实现,是由一系列特殊编码的连续内存块组成的顺序型数据结构,其目的是节省内存。ziplist 的结构外层结构下图展示了压缩列表的组成:各个字段的含义如下:zlbytes:是一个无符号 4 字节整数,保存着 ziplist 使用的内存数量。通过 zlbytes,程序可以直接对 ziplist 的内存大小进行调整,无须为了计算 ziplist 的内存大小而遍历整个列表。zltail:压缩列表 最后一个 entry 距离起始地址
2020-12-27 22:58:15
202
原创 Redis 源码解析 3:字符串 SDS
在 Redis 中,字符串都用自定义的结构简单动态字符串(Simple Dynamic Strings,SDS)。Redis 中使用到的字符串都是用 SDS,例如 key、string 类型的值、sorted set 的 member、hash 的 field 等等等等。。。
2020-12-25 17:10:52
160
原创 Redis 源码解析 2:Redis 对象 redisObject
在 Redis 中,有五大数据类型,都统一封装成了一个数据类型:redisObject
2020-12-25 11:14:39
172
原创 Redis 源码解析 1:数据库 redisDb
Redis 服务器将绝大部分的信息都保存在 `server.h/redisServer`。redis 的数据是保存在 `redisServer` 中的 `redisDb` 结构中。
2020-12-25 11:13:15
274
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人