Netty源码剖析
文章平均质量分 86
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
人月IT
深挖问题与动手实践-完成率比完成度更重要
展开
-
netty keepalive 和 idle 的关系
Netty keepalive 和 idle 的三角关系原创 2021-08-17 15:08:41 · 25398 阅读 · 0 评论 -
Netty 入门
基本过程如下:1 初始化创建2个NioEventLoopGroup,其中boosGroup用于Accetpt连接建立事件并分发请求, workerGroup用于处理I/O读写事件和业务逻辑2 基于ServerBootstrap(服务端启动引导类),配置EventLoopGroup、Channel类型,连接参数、配置入站、出站事件handler3 绑定端口,开始工作结合上面的介绍的Netty Reactor模型,介绍服务端Netty的工作架构图:工作原理架构初始化并启动Netty服务端过程如下:原创 2021-08-11 14:24:29 · 34327 阅读 · 7 评论 -
源码剖析 Netty 服务启动 NIO
最后,我们来总结一下整个服务启动的过程,服务启动主要是通过两个主要的大方法来完成的:initAndRegister (),初始化并注册什么呢?channelFactory.newChannel() 1 通过反射创建一个 NioServerSocketChannel2 将 Java 原生 Channel 绑定到 NettyChannel 中3 注册 Accept 事件4 为 Channel 分配 id5 为 Channel 创建 unsafe6 为 Channel 创建 Channel原创 2021-07-30 10:20:42 · 28188 阅读 · 0 评论 -
如何快速排查生产问题
如何快速排查生产问题大家都遇到过哪些生产问题呢磁盘满了?CPU 飙高?内存溢出?内存溢出又分好几种:堆内存溢出、元空间溢出、线程栈溢出、直接内存溢出。在 Netty 中,最常见的当属直接内存溢出了,而内存溢出,往往又是内存泄漏导致的,所以,我们一般是排查内存泄漏。那么,对于直接内存泄漏,我们该如何快速排查呢?这里,我总结了几个步骤以供参考:1 查看监控,直接内存使用情况是否稳定;2 查看日志,是否有直接内存相关的报错;3 本地调试,关闭池化内存、添加内存泄漏检测、模拟大量请原创 2021-07-30 09:45:23 · 22912 阅读 · 0 评论 -
TCP 粘包半包 netty 编解码 三者关系
1 何为粘包 / 半包?对方一次性接收了多条消息这种现象,我们就称之为 粘包现象。对方多次接收了不完整消息这种现象,我们就称之为 半包现象。粘包的原因:发送方发送的消息 < 缓冲区大小接收方读取消息不及时半包的原因类比粘包,如果发送的消息太大,已经 超过了缓冲区的大小,这时候就 必须拆分发送,也就 形成了半包现象。半包的原因:发送方发送的消息 > 缓冲区的大小发送方发送的消息 > 协议的 MTU表面原因:1 发送消息的时候如果消息太小,先放到缓冲区里面放着,原创 2021-08-18 11:15:46 · 23621 阅读 · 0 评论 -
Netty 的核心组件
Netty 的核心组件有哪些?1. Bootstrap 与 ServerBootstrapBootstrap 与 ServerBootstrap 是 Netty 程序的引导类,主要用于配置各种参数,并启动整个 Netty 服务。它们俩都继承自 AbstractBootstrap 抽象类,不同的是, Bootstrap 用于客户端引导,而 ServerBootstrap 用于服务端引导。相对于 Bootstrap , ServerBootstrap 多了一个维度,用于处理 Accept原创 2021-08-17 16:32:53 · 31548 阅读 · 0 评论 -
netty 常见疑问 faq
netty如何支持主从reactor模式?2.为什么说netty的main reactor大多并不能用到一个线程组,只能线程组里面的一个?3.netty给channel分配NioEventloop的规则是什么?4.通用模式的nio实现多路复用是怎么跨平台的?...原创 2021-08-12 21:42:42 · 24978 阅读 · 0 评论 -
IO 的五种模型
阻塞和非阻塞有什么区别呢?同步和异步又有什么区别呢?用户空间和内核空间操作系统的核心是内核,它独立于普通的应用程序,可以访问受保护的内核空间,也有访问底层硬件设备的所有权限。为了保护内核的安全,现在操作系统一般都强制用户进程不能直接操作内核、所以操作系统把内存空间划分成了两个部分:内核空间和用户空间。这就好比,饭店老板把整个饭店划分成两个部分:大厅和厨房。大厅用于顾客吃饭,厨房用于厨师做饭,厨房的门上面一般还会写着: “ 厨房重地,闲人免进 ” ,也就是顾客一般不具有直接使用厨房的特性。所以原创 2021-08-10 17:10:27 · 22528 阅读 · 0 评论 -
什么是 NIO
NIO 模型中的 N 一般指代 Non-blocking ,即非阻塞的意思,NIO 即非阻塞 IO 的意思。广义上来说,NIO 包括Non-blocking IO (非阻塞 IO )、IO Multiplexing ( IO 多路复用)、Signal-DrivenIO (信号驱动 IO )。狭义上来说,NIO 仅指 Non-blocking IOJava NIO 中的 N 是指 New ,即新的意思, Java NIO 即新的 IO ,是相对于 OIO (Old IO)原创 2021-08-10 13:55:48 · 24475 阅读 · 0 评论 -
Netty 线程池
Netty的线程池有什么样的特性Java 原生线程池Java 原生的线程池主要有三种:ThreadPoolExecutor、ScheduledThreadPoolExecutor、ForkJoinPool。ThreadPoolExecutor 是最古老的类,我们通常说的线程池,也是指这个类。ScheduledThreadPoolExecutor 是用来执行定时任务的线程池。ForkJoinPool 是 Java7 新增的类,它使用的是工作窃取的算法实现的一种高效的线程池,非常适合解决大任务不断地原创 2021-08-09 17:02:06 · 24883 阅读 · 2 评论 -
Netty 对象池
Netty的对象池又是如何实现的Netty 内存池的知识,它主要采用 jemalloc 内存分配器来实现问题关于 Netty 对象池,我想问你几个问题:1 Netty 对象池与内存池的区别与联系?2 Netty 内存池中是否使用到了对象池?3 Netty 对象池中是否使用到了内存池?4 Netty 对象池实现的基本逻辑?...原创 2021-08-09 09:47:20 · 22279 阅读 · 0 评论 -
Netty 的 内存池 是如何实现的
对于今天的源码剖析,你可以带着下面这么几个问题:1 PoolArena中的PoolSubpage数组和PoolChunk中的PoolSubpage数组有什么关联?2 PoolThreadCache中的MemoryRegionCache数组与PoolSubpage是否有联系?3 Netty内存池的整体结构是什么样的?4 如果让你来介绍Netty内存池,你如何来描述?内存池源码剖析调试用例上一节,我们说了Netty根据请求的大小将其分成四类:Tiny、Small、Normal、Huge,这四类请求原创 2021-08-06 09:39:09 · 22448 阅读 · 0 评论 -
jemalloc 内存分配器 是什么
jemalloc 内存分配器 是什么?内存池所谓内存池,是指应用程序向操作系统(或 JVM)申请一块内存,自己管理这一块内存,对象的创建和销毁都从这块内存中分配和回收,这么一块内存就可以称作内存池,对应地,管理这块内存的工具就称作内存分配器。同时,对于申请对象的不同又可以分为堆内存池和直接内存池,1 如果是向 JVM 申请的内存,那就是堆内存池,2 如果是向操作系统申请的内存,那就是直接内存池。那么,有哪些内存分配器呢?业界比较著名的有三个内存分配器:1 ptmalloc,Doug Lea原创 2021-08-04 14:40:01 · 23197 阅读 · 0 评论 -
什么是 伪共享
伪共享在现在的 CPU 架构下,一般地,一台计算机都有多个 CPU 核心,叫作多核 CPU,这些 CPU 都要从一块叫作内存的地方读取数据,经过加工处理,再写回到内存中,如果每次读写数据都跟内存进行交互,太慢了,你可以想像成内存跟硬盘的关系,所以,为了加快 CPU 的处理速度,人们就给 CPU 安上了缓存,一般地,现代处理器都具有三级缓存,这三缓存也有个关系,越接近 CPU 的缓存越快越贵容量越小,越远离 CPU 的缓存越慢越便宜容量越大。比如,对于一台 4 核 CPU 的计算机,它的缓存布局可能是这样原创 2021-08-04 11:01:00 · 23980 阅读 · 0 评论 -
Netty的队列有何不一样
Netty的队列有何不一样其实呢,追踪一下常用的 Spring 等框架,会发现正常运转的情况下,一个线程最多也就三四十个 ThreadLocal 变量,那么,Netty 为何还要大费周章搞一个 FastThreadLocal 呢?这是由于 Netty 的使用场景导致的,不管是对象池还是内存池,亦或者是前面讲到的请求处理的过程,都大量使用了线程本地变量,且操作频繁,而 Java 原生的 ThreadLocal 使用的是线性探测法实现的哈希表,使得哈希冲突的概率太大且解决冲突的方式也不友好,且解决冲突之后更容原创 2021-08-04 09:19:21 · 22524 阅读 · 2 评论 -
Netty 的 FastThreadLocal 到底快在哪里
Netty的FastThreadLocal到底快在哪里在 Java 中有 ThreadLocal 可以存储线程本地变量,但是,在 Netty 中,并没有使用 Java 原生的 ThreadLocal,而是创建了一个新的类 ——FastThreadLocal关于 FastThreadLocal 的学习,我想问你这么几个问题:1 Java 原生的 ThreadLocal 是如何实现的?有什么缺点?2 FastThreadLocal 是如何实现的?有什么优点和缺点?3 FastThreadLocal 有原创 2021-08-03 16:32:53 · 22347 阅读 · 0 评论 -
Netty 的 ByteBuf 是如何支持 堆内存非池化 实现的
Netty的ByteBuf是如何支持堆内存非池化实现的ByteBuffer 从实现方式上分成HeapByteBuffer 和 DirectByteBuffer 两种内存实现方式,HeapByteBuffer 底层使用 byte 数组存储数据,DirectByteBuffer 底层使用 unsafe 操作直接内存Java 原生的 Buffer 有三种不同的分类方式:按数据类型、按内存实现方式、按读写方式,可以分成不同的 Buffer。那么,今天,我想问:1 Netty 中的 ByteBuf 有没原创 2021-08-02 19:05:40 · 22476 阅读 · 0 评论 -
Netty 从源码的角度深入剖析 ByteBuffer
如何从源码的角度深入剖析ByteBuffer你只看见了调用一个方法就能创建符合要求的 ByteBuf 却不知为何如此简单,你只看见了 Netty 使用了线程池却不知线程池用的是什么队列你只看见了 Netty 到处都在使用 Promise 却不知 Promise 为何物问题我们知道,Netty 之所以如此高效,很大一部分原因得益于其对直接内存的高效使用,所以,今天,我想问:1 Java 中的 ByteBuffer 有直接内存的实现吗?2 Java 中如何使用直接内存?又如何释放直接内存呢?3原创 2021-08-02 17:24:03 · 23645 阅读 · 0 评论 -
如何优雅关闭 Netty服务
Netty服务如何优雅关闭Netty 中将写出数据分成了两个部分第一部分先缓存起来第二部分再通过 Java 原生的 SocketChannel 发送出去。问题原创 2021-08-02 13:38:21 · 26987 阅读 · 0 评论 -
Netty服务如何写出数据
Netty服务如何写出数据上一节,我们一起学习了 Netty 接收新数据过程的源码剖析,我们又发现了一个有趣的现象,Netty 的 ByteBuf 竟然也是对 Java 原生 ByteBuffer 的包装。经过前面的学习,我想你一定迫不及待地想知道 Netty 中写出数据的过程了吧,也有可能,你自己已经根据我们前面的调试方法自己看了,也有可能,睿智的你已经猜测 Netty 中写出数据,肯定也是调用 Java 原生 SocketChannel 的写出数据。我们知道,Java 原生 NIO 写出数据是从原创 2021-07-30 17:09:59 · 22626 阅读 · 0 评论 -
Netty 服务 接收新数据
Netty服务如何接收新的数据原创 2021-07-30 15:50:53 · 23259 阅读 · 0 评论 -
Netty 服务 如何 接收新的连接
Netty服务如何接收新的连接调试技巧:从基本概念出手,寻找突破点;观察线程栈,寻找关键字眼服务接收新连接过程:1在NioEventLoop中轮询select ,2调用java原生ServerSocketChannel的accept()方法接收新连接3.包装java原生SocketChannel,对其进行增强...原创 2021-07-30 10:38:14 · 23827 阅读 · 0 评论 -
Netty编码 及 writeAndFlush()
第9章 Netty编码及writeAndFlush()原创 2018-08-26 20:29:31 · 1017 阅读 · 0 评论 -
Netty性能优化工具类解析
第10章 Netty性能优化工具类解析原创 2018-08-26 20:30:02 · 1011 阅读 · 0 评论 -
Netty设计模式应用
第11章 Netty设计模式应用原创 2018-08-26 20:30:32 · 1946 阅读 · 3 评论