资讯专栏INFORMATION COLUMN

Netty 4.1 源代码学习:内存管理

Pink / 1042人阅读

摘要:随着内存的分配和释放,的使用率会发生变化,导致在这个双向列表里流动,比如随着使用率的降低从移到。一个包含多个固定大小的内存块,并使用位图来跟踪这些内存块的分配和释放是对的封装,提供顺序和随机读写字节的功能。

前言 概念 Area

Netty 将内存分为 heap(java 堆区)和 direct(直接内存)区,heap 区依靠 java GC进行内存回收,direct 区需要显式进行释放

PoolArena 类是分区内存的基类,它有两个子类 HeapArena 和 DirectArena 分别对应 heap 区和 direct 区

Trunk

chunk 是比 area 小一级的内存分配单元,多个 chunk 按照 usage(使用率)组成chunk list,area 包含 6 个 chunk list:

// PoolArena 构造方法
q100 = new PoolChunkList(null, 100, Integer.MAX_VALUE, chunkSize);
q075 = new PoolChunkList(q100, 75, 100, chunkSize);
q050 = new PoolChunkList(q075, 50, 100, chunkSize);
q025 = new PoolChunkList(q050, 25, 75, chunkSize);
q000 = new PoolChunkList(q025, 1, 50, chunkSize);
qInit = new PoolChunkList(q000, Integer.MAX_VALUE, 25, chunkSize)

PoolChunkList 构造方法的第一个参数是 下一个 PoolChunkList 的引用,PoolChunList 的 prevList 方法设置 上一个 PoolChunkList:

// PoolArena 构造方法
q100.prevList(q075);
q075.prevList(q050);
q050.prevList(q025);
q025.prevList(q000);
q000.prevList(null);
qInit.prevList(qInit);

所有的 PoolChunkList 组成双向列表,qInit 是列表头。随着内存的分配和释放,PoolChunk 的使用率会发生变化,导致 PoolChunk 在这个双向列表里"流动",比如随着使用率的降低从 q075 移到 q050。

Page

page 是最小的内存分配单元,一个 chunk 里面包含多个 page,chunk 使用基于平衡二叉树的伙伴分配算法来分配和释放 page。一个 page 包含多个固定大小的内存块,并使用位图(bitmap)来跟踪这些内存块的分配和释放

ByteBuf

ByteBuf 是 netty 对 byte[] 的封装,提供顺序和随机读写字节的功能。ByteBuf 是一个抽象类 ,它有众多的子类:

功能类(是否缓存, 内存分配方式, 是否使用 unsafe)

PooledHeapByteBuf

PooledUnsafeHeapByteBuf

PooledDirectByteBuf

PooledUnsafeDirectByteBuf

UnpooledHeapByteBuf

UnpooledUnsafeHeapByteBuf

UnpooledDirectByteBuf

UnpooledUnsafeDirectByteBuf

包装类:

ReadOnlyByteBufferBuf,对 idk 提供的 ByteBuffer 的只读封装

CompositeByteBuf, 组合多个 ByteBuf

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65866.html

相关文章

  • Netty 4.1 代码学习:线程模型

    摘要:前言本文以自带的示例工程为例,简要介绍线程模型示例工程的代码位于很简单,仅包含一个方法用于初始化以及,我们来看看其中和线程模型相关的一些代码在的初始化代码中实例化了两个对象和,它们有着公共基类,这个是线程模型的核心类名让人联想到组合模式, 前言 本文以 netty 4.1 自带的示例工程 netty-example 为例,简要介绍 netty 线程模型 EchoServer echo ...

    monw3c 评论0 收藏0
  • 一个简单的Netty-EchoDemo

    摘要:它甚至使用不安全的伪随机生成器在内部更快地生成项目源码一个简单的应答通讯的实例判断是否加密监听本地服务监听端口发送消息的大小,用于公共抽象类,安全套接字协议实现充当工厂和。 本博客 猫叔的博客,转载请申明出处阅读本文约 4分钟 适读人群:Java-Netty 初级 Echo简易通讯案例 版本:netty 4.1.*申明:本文旨在重新分享讨论Netty官方相关案例,添加部分个人理解与要...

    I_Am 评论0 收藏0
  • Netty 框架总结「ChannelHandler 及 EventLoop」

    摘要:随着状态发生变化,相应的产生。这些被转发到中的来采取相应的操作。当收到数据或相关的状态改变时,这些方法被调用,这些方法和的生命周期密切相关。主要由一系列组成的。采用的线程模型,在同一个线程的中处理所有发生的事。 「博客搬家」 原地址: 简书 原发表时间: 2017-05-05 学习了一段时间的 Netty,将重点与学习心得总结如下,本文主要总结ChannelHandler 及 E...

    VioletJack 评论0 收藏0
  • Spring整合Netty、WebSocket的互联网聊天系统

    摘要:当用户注销或退出时,释放连接,清空对象中的登录状态。聊天管理模块系统的核心模块,这部分主要使用框架实现,功能包括信息文件的单条和多条发送,也支持表情发送。描述读取完连接的消息后,对消息进行处理。 0.前言 最近一段时间在学习Netty网络框架,又趁着计算机网络的课程设计,决定以Netty为核心,以WebSocket为应用层通信协议做一个互联网聊天系统,整体而言就像微信网页版一样,但考虑...

    My_Oh_My 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<