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编程的方式来使用堆外内存

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值