
Netty
Netty相关
fedorafrog
这个作者很懒,什么都没留下…
展开
-
Netty零拷贝的实现原理
零拷贝的应用程序要求内核(kernel)直接将数据从磁盘文件拷贝到套接字(Socket),而无须通过应用程序。零拷贝不仅提高了应用程序的性能,而且减少了内核和用户模式见上下文切换。1.传统方法从文件中读取数据,并将数据传输到网络上的另一个程序的场景:从下图可以看出,拷贝的操作需要4次用户模式和内核模式之间的上下文切换,而且在操作完成前数据被复制了4次。从磁盘中copy放到一个内存buf中,然后将buf通过socket传输给用户,下面是伪代码实现:read(file, tm...转载 2020-12-01 11:33:11 · 938 阅读 · 0 评论 -
Netty内存池化(四)规避内存泄漏
内存检测原理使用的是PhantomReference技术,通过判断ByteBuf的refCount是否为0,判断是否存在内存泄漏。1.检测原理无论是池化的ByteBuf还是非池化的ByteBuf,BuyeBuf(不一定是该对象)对象在被gc回收之后,通过判断refCount是否为0来判断是否发生了内存泄漏。netty支持下面四种级别,使用-Dio.netty.leakDetectionLevel=advanced可以调节等级。禁用(DISABLED) - 完全禁止泄露检测,省点消耗。 简.转载 2020-12-01 11:22:56 · 2023 阅读 · 0 评论 -
Netty内存池化(三)真实内存池
真实内存指的是ByteBuf底层的array和DirectByteBuffer,真实内存池化的好处如下:降低真实内存的分配开销。因为DirectByteBuffer的分配很抵效(创建堆外内存的速度比堆内存慢了10到20倍),特别的对于DirectByteBuffer的分配开销降低尤为明显。 因为真实内存可以复用,避免了大量对象的回收,降低了GC频率。怎么降低线程竞争的默认有核数*2个PoolArea,每个线程初始绑定一个最少线程使用的PoolArea,线程一旦绑定了对应的PoolArea,不能再转载 2020-12-01 11:13:47 · 1105 阅读 · 1 评论 -
Netty内存池化(二)对象池Recycler
在netty的池化ByteBuf分配中,包含ByteBuf对象的池化和真实内存(array或者DirectByteBuffer)的池化。实际上Recycler不仅可以用于ByteBuf对象的池化,他是一个通用的对象池化技术,我们可以直接使用Recycler实现自身系统对象的池化。1.对象池化的作用在netty中ByteBuf的创建是个非常频繁的过程,使用对象池可以起到对象可以复用,减少gc频率的作用。2.Recycler的关键技术点2.1 多线程竞争下的对象分配和释放(怎么减小多线程..转载 2020-12-01 11:02:58 · 502 阅读 · 0 评论 -
Netty内存池化(一)总览
Netty的ByteBuf分为池化的和非池化的,池化的优点包含如下两点:对于DirectByteBuffer的分配和释放是比较低效的,使用池化技术能快速分配内存。 池化技术使对象可以复用,从而降低gc频率。ByteBuf实际包含两部分内容,一部分是底层的真实内存(array或者DirectByteBuffer)和ByteBuf对象。真实内存的池化参见本文第2部分,ByteBuf的对象的池化参见本文第1部分。Netty的ByteBuf泄漏检测(池化和非池化都能检测)原理参见本文的第3部分。内存池是转载 2020-12-01 10:51:40 · 1719 阅读 · 0 评论 -
Netty中粘包和拆包的解决方案
粘包和拆包是TCP网络编程中不可避免的,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。1.TCP粘包和拆包TCP是个“流”协议,所谓流,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。如图所示,假设客户端分别发送了两个数据包D1和D2给服务.转载 2020-12-01 10:43:17 · 4115 阅读 · 0 评论 -
Netty高性能原理和框架架构简介
1.JDK 原生 NIO 程序的问题JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下:1)NIO 的类库和 API 繁杂,使用麻烦:你需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。2)需要具备其他的额外技能做铺垫:例如熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的 NIO 程序。3)可靠性能力补齐,开发工作量.转载 2020-11-30 16:40:14 · 186 阅读 · 0 评论