这章的内容主要是分析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编程的方式来使用堆外内存