Netty5源码学习之buffer篇(一):PooledHeapByteBuf

简介:

PooledHeapByteBuf,带有池的堆内buffer,顾名思义,肯定比一般通过new出来的buffer性能好。把对象放入对象池缓存起来,一般都是因为创建该对象开销比较大,常见的有线程池(ThreadPool)、连接池(ConnectionPool)等。

PooledHeapByteBuf继承关系如下:
PooledHeapByteBuf –》 PooledByteBuf –》 AbstractReferenceCountedByteBuf –》 AbstractByteBuf –》 ByteBuf。
继承关系比较简单清晰。

先介绍几个相关的类:

PooledByteBufAllocator:buffer分配器,用来分配buffer(包括堆内和堆外)。

PoolArena:一块逻辑上的内存池,用来管理和组织buffer的,内部数据结构较复杂。

FastThreadLocal:较快的ThreadLocal(相对于jdk自带的),实现:线程T扩展于FastThreadLocalAccess,InternalThreadLocalMap是它的成员变量,set()时放入InternalThreadLocalMap的成员变量数组,下标是index,get()时从InternalThreadLocalMap的成员变量数组中下标是index处取。

Recycler:回收器,基于FastThreadLocal,缓存的本地对象是个stack,stack里装的是Handler,handler里装的buffer。新建buffer时,从Recycler中的FastThreadLocal取,FastThreadLocal取出当前线程的本地变量stack,stack.pop()弹出handler,handler调用newObject()生成。

练习代码debug下:

1

2

3

4

5

<dependency>

<groupId>io.netty</groupId>

<artifactId>netty-all</artifactId>

<version>5.0.0.Alpha2</version>

</dependency>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

package com.zoo;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.PooledByteBufAllocator;

import io.netty.util.concurrent.FastThreadLocalThread;

/**

*

* @author yankai913@gmail.com

* @date 2015-3-31

*/

public class PooledHeapByteBufTest {

static PooledByteBufAllocator alloc = new PooledByteBufAllocator();

static void singleThread() {

new FastThreadLocalThread(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 3; i++) {

String name = Thread.currentThread().getName();

long start = System.currentTimeMillis();

ByteBuf buf = alloc.buffer(102400);

long end = System.currentTimeMillis();

System.out.println(name + "\t" + buf + ", time:" + (end - start));

}

}

}).start();

}

public static void main(String[] args) throws Exception {

singleThread();

}

}

打印结果:
Thread-1 SimpleLeakAwareByteBuf(PooledHeapByteBuf(ridx: 0, widx: 0, cap: 102400)), time:62
Thread-1 PooledHeapByteBuf(ridx: 0, widx: 0, cap: 102400), time:0
Thread-1 PooledHeapByteBuf(ridx: 0, widx: 0, cap: 102400), time:0


相关文章
|
存储 网络协议 Java
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
选择器,也叫多路复用器,Java的NIO通过selector实现一个线程处理多个客户端链接,多个channel可以注册到同一个Selector,Selector能够监测到channel上是否有读/写事件发生,从而获取事件和对事件进行处理,所以Selector切到哪个channel是由事件决定的。当线程从某个客户端通道未读取到数据时,可以把空闲时间用来做其他任务,性能得到了提升。
165 0
|
弹性计算 Java API
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
理解Selector 和 Channel Selector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。 通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 由于它的读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。
263 0
|
存储 Java
Netty:NIO buffer 原理(附 示例代码)
Netty:NIO buffer 原理(附 示例代码)
Netty:NIO buffer 原理(附 示例代码)
|
网络协议 索引
【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作
【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作
147 0
【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作
|
机器学习/深度学习 索引
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
138 0
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
|
Java API
【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )
【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )
171 0
【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )
|
API
【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例
【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例
214 0
|
存储
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(一)
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(一)
210 0
|
Java API 索引
Netty buffer缓冲区ByteBuf
Netty buffer缓冲区ByteBuf byte 作为网络传输的基本单位,因此数据在网络中进行传输时需要将数据转换成byte进行传输。netty提供了专门的缓冲区byte生成api ByteBuf。
1569 0