Netty的深入浅出--52.Netty的自适应缓冲区分配策略与堆外内存创建方式

这章的内容主要是分析netty对于缓冲区内存分配buffer的时候是怎么根据不同情况进行区分堆外内存和堆内内存的。

很现实的内存缓冲问题,当所给的内存太大,就会产生资源的浪费。如果所给的内存太少,就会出现数据的拷贝,这种情况下性能的浪费也会增大。

对于这些问题是怎么解决的,我们继续往下分析。

从serverBootstrap.bind()方法开始

 

 

 

 

 

 

 

 反射的还是我们传入的NioServerSocketChannel.class

我们进入到NioServerSocketChannel的构造方法:

  

 

所以我们可以看到NioServerSocketChannel返回的是ServerSocketChannel对象。

接着this()调用类里面的另外一个方法 

 

我们查看它的父对象:

 

 

 

然后往回看

 

ServerSocketChannelConfig是专门用来配置的组件

 

 

返回重点看这行代码

 

 

 

 

返回查看该类主要是做什么的

 

查看这个类的java doc文档(这个将是我们的重点)

该类会自动预测的增加和减少buffer的大小

当buffer被填满的时候,它会自动的去逐渐增加buffer的容量。如果buffer并没有填充到某个量,它会自动的去逐渐减少buffer的容量。

 

前面我们可以看到,它默认的调用是一个不带参数的构造方法

它要求默认的初始值是1024,最小不低于64,最大不超过65536

 

 我们往上看它的静态代码块:

将需要分配的缓冲区大小按照从小到大的顺序保存到SIZE_TABLE数组中,使用的时候直接从里面读取就可以了。

 现在有了缓冲区大小,那么我们应该如何申请缓冲区呢?

 

继续往底层查看,我们会发现在if语句里面就有堆内内存和堆外内存的判断

 

 

 

 

我们继续往回分析,这是NIO编程的方式来使用堆外内存

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_37909508/article/details/91372451