Netty解析二十三:Netty内存分配PoolSubpage
上一篇解析了Netty内存分配的伙伴模型和PoolChunk的原理,如果需要分配的内存大于等于pageSize则会直接通过Chunk进行分配,不过不会产生Page对象;如果小于pageSize也就是分为tiny/small会通过Chunk然后分配Subpage,由Subpage来管理具体内存。
上一篇解析了Netty内存分配的伙伴模型和PoolChunk的原理,如果需要分配的内存大于等于pageSize则会直接通过Chunk进行分配,不过不会产生Page对象;如果小于pageSize也就是分为tiny/small会通过Chunk然后分配Subpage,由Subpage来管理具体内存。
Netty的内存分配与JEMalloc类似,从大到小可以划分为:Arena, Chunk, Page, SubPage
其中核心的是Chunk,Chunk使用伙伴分配算法分配Chunk中的Page节点,而Page由更小的SubPage组成。
Netty的PooledByteBuf采用与jemalloc[jemalloc 在 2005 年首次作为 FreeBSD libc 分配器使用]一致的内存分配算法。
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。同步,就是调用某个东西是,调用方得等待这个调用返回结果才能继续往后执行。异步,和同步相反 调用方不会理解得到结果,而是在调用发出后调用者可用继续执行后续操作,被调用者通过状体来通知调用者,或者通过回掉函数来处理这个调用。
产生粘包和拆包问题的主要原因是,操作系统在发送TCP数据的时候,底层会有一个缓冲区,例如1024个字节大小,如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题;如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包,也就是将一个大的包拆分为多个小包进行发送。