加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

看完这篇还不清楚Netty的内存管理,那我就哭了!

发布时间:2019-08-15 23:22:21 所属栏目:建站 来源:零度冰炫
导读:声名 在进修Netty的时辰,ByteBuf四处可见,可是怎样高效分派ByteBuf照旧很伟大的,Netty的池化内存分派这块照旧较量难的,许多人进修过,看过可是照旧云里雾里的,本篇文章就是首要来讲授:Netty分派池化的堆外内存的细节,等候可以让你大白!!! 因为为了
副问题[/!--empirenews.page--]

 声名

在进修Netty的时辰,ByteBuf四处可见,可是怎样高效分派ByteBuf照旧很伟大的,Netty的池化内存分派这块照旧较量难的,许多人进修过,看过可是照旧云里雾里的,本篇文章就是首要来讲授:Netty分派池化的堆外内存的细节,等候可以让你大白!!!

看完这篇还不清晰Netty的内存打点,那我就哭了!

因为为了更好的表达,文章中的图我起码画了6小时,画的不认识,而且也夸大一些细节上。

因为该源码中涉及到大量的二进制操纵,提议看看其他二进制文章。

ByteBuf重要性

ByteBuf在Netty中一向存在,读写必备!ByteBuf是Netty的数据容器,高效分派ByteBuf至关重要!

看完这篇还不清晰Netty的内存打点,那我就哭了

Netty从socket读取数据。

看完这篇还不清晰Netty的内存打点,那我就哭了

Netty筹备把数据写到socket中去。

看完这篇还不清晰Netty的内存打点,那我就哭了

通过这里我们就可以看到,再把数据写socket的之前会判定是否是堆外内存,假如不是会结构一个directbuffer工具的,细节代码如下:

看完这篇还不清晰Netty的内存打点,那我就哭了
看完这篇还不清晰Netty的内存打点,那我就哭了

以是本篇文章就是首要来讲授:Netty分派池化的堆外内存的细节,着实分派堆内存的细节许多也是相同的。

备注: 为什么不是堆外内存还要转堆外内存,为什么加这个判定,我之前也不领略,突然有天和涤生大佬接头,接头接头就清楚了,后续有空写篇。

总览

看完这篇还不清晰Netty的内存打点,那我就哭了

本次首要接头的是关于池化内存的分派,PooledByteBufAllocator就是netty分派池化内存的操纵进口。

其提供对外常用操纵api:

看完这篇还不清晰Netty的内存打点,那我就哭了

Netty在发送数据的时辰会判定是否是堆外内存,假如不是会举办封装的:

看完这篇还不清晰Netty的内存打点,那我就哭了

全部这里我们以分派池化的堆外内存为例,举办本文声名。池化的堆内存分派着实流程都差不多的。

下面我们来看看分派示例demo:

看完这篇还不清晰Netty的内存打点,那我就哭了

后续我们城市按照这段简朴的demo举办说明。

操纵进口类

PooledByteBufAllocator的初始化:

看完这篇还不清晰Netty的内存打点,那我就哭了

进去之后可以看到焦点类的一初始化操纵:

看完这篇还不清晰Netty的内存打点,那我就哭了

看完这篇还不清晰Netty的内存打点,那我就哭了

看完这篇还不清晰Netty的内存打点,那我就哭了

分派理论是jemalloc,可以领略为java版本的jemalloc实现。

PoolThreadCache

看完这篇还不清晰Netty的内存打点,那我就哭了

通过上图可以清楚的相识到PoolThreadCache的首要数据布局。

开始的时辰,这些Cache内里都是没有值的,只有在挪用free开释的时辰(在后续开释内存中会讲授),才会把之前分派的内存巨细放到该cache的queue内里,着实每次分派的时辰都是先看看是否缓存内里有,假若有直接返回,没有则举办正常的分派流程(内存分派会讲授)。

我们来看看PoolArena directArena内容:

看完这篇还不清晰Netty的内存打点,那我就哭了

下面我们来看看PoolArena布局。

PoolArena

看完这篇还不清晰Netty的内存打点,那我就哭了

通过下图可以清楚的相识到PoolArena的首要数据布局。

看完这篇还不清晰Netty的内存打点,那我就哭了

在PoolArena内里涉及到PoolChunkList和PoolSubpage对应的布局有PoolChunk和PoolSubpage,我们来具体的看看这2块内容。

PoolChunk

第一次的时辰,PoolChunkList、PoolSubpage都是默认值,必要新增一个Chunk,默认一个Chunk是16M。内部会布局是完全二叉树一共有4096个节点,有2048个叶子节点(每个叶子节点巨细为一个page,就是8k),非叶子节点的内存巨细便是左子树内存巨细加上右子树内存巨细。

完全二叉树布局如下:

看完这篇还不清晰Netty的内存打点,那我就哭了

这颗完全二叉树在java中是行使数组来举办暗示的。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读