Netty内存管理--内存池空间规格化SizeClasses
一、规格化
内存池类似于一个内存零售商, 从操作系统中申请一整块内存, 然后对其进行合理分割, 将分割后的小内存返回给程序。这里存在3个尺寸:
- 分割尺寸: 底层内存管理的基本单位, 比如常见的以页为单位分配, 但是页的大小是灵活的;
- 申请尺寸: 内存使用者希望申请到的内存大小;
- 分配尺寸: 内存池实际分配的内存大小, 存在该尺寸的原因是分配尺寸>=申请尺寸;
总结来说, 内存规格化就是确定有哪些尺寸的内存, 针对不同的申请尺寸提供对应的分配尺寸。
二、规格化描述7元组
每一种尺寸使用下面的7元组表示| 元组字段以及含义如下
name | 代码注释 | 个人理解 |
---|---|---|
index | Size class index | 从0开始的索引 |
log2Group | Log of group base size (no deltas added) | 尺寸分组的base |
log2Delta | Log of delta to previous size class | 分组内的增量单位 |
nDelta | Delta multiplier | 分组内增量单位的倍数 |
isMultiPageSize | ‘yes’ if a multiple of the page size ‘no’ otherwise | 是否为Page的整倍数 |
isSubPage | ‘yes’ if a subpage size class ‘no’ otherwise. | 是否可能为SubPage |
log2DeltaLookup | Same as log2Delta if a lookup table size class ‘no’ otherwise. | 代码中没有使用 |
三、规格化结果
index | log2Group | log2Delta | nDelta | isMultiPageSize | isSubPage | log2DeltaLookup | size |
---|---|---|---|---|---|---|---|
0 | 4 | 4 | 0 | 0 | 1 | 4 | 16 |
1 | 4 | 4 | 1 | 0 | 1 | 4 | 32 |
2 | 4 | 4 | 2 | 0 | 1 | 4 | 48 |
3 | 4 | 4 | 3 | 0 | 1 | 4 | 64 |
4 | 6 | 4 | 1 | 0 | 1 | 4 | 80 |
5 | 6 | 4 | 2 | 0 | 1 | 4 | 96 |
6 | 6 | 4 | 3 | 0 | 1 | 4 | 112 |
7 | 6 | 4 | 4 | 0 | 1 | 4 | 128 |
8 | 7 | 5 | 1 | 0 | 1 | 5 | 160 |
9 | 7 | 5 | 2 | 0 | 1 | 5 | 192 |
10 | 7 | 5 | 3 | 0 | 1 | 5 | 224 |
11 | 7 | 5 | 4 | 0 | 1 | 5 | 256 |
12 | 8 | 6 | 1 | 0 | 1 | 6 | 320 |
13 | 8 | 6 | 2 | 0 | 1 | 6 | 384 |
14 | 8 | 6 | 3 | 0 | 1 | 6 | 448 |
15 | 8 | 6 | 4 | 0 | 1 | 6 | 512 |
16 | 9 | 7 | 1 | 0 | 1 | 7 | 640 |
17 | 9 | 7 | 2 | 0 | 1 | 7 | 768 |
18 | 9 | 7 | 3 | 0 | 1 | 7 | 896 |
19 | 9 | 7 | 4 | 0 | 1 | 7 | 1024 |
20 | 10 | 8 | 1 | 0 | 1 | 8 | 1280 |
21 | 10 | 8 | 2 | 0 | 1 | 8 | 1536 |
22 | 10 | 8 | 3 | 0 | 1 | 8 | 1792 |
23 | 10 | 8 | 4 | 0 | 1 | 8 | 2048 |
24 | 11 | 9 | 1 | 0 | 1 | 9 | 2560 |
25 | 11 | 9 | 2 | 0 | 1 | 9 | 3072 |
26 | 11 | 9 | 3 | 0 | 1 | 9 | 3584 |
27 | 11 | 9 | 4 | 0 | 1 | 9 | 4096 |
28 | 12 | 10 | 1 | 0 | 1 | 0 | 5120 |
29 | 12 | 10 | 2 | 0 | 1 | 0 | 6144 |
30 | 12 | 10 | 3 | 0 | 1 | 0 | 7168 |
31 | 12 | 10 | 4 | 1 | 1 | 0 | 8192 |
32 | 13 | 11 | 1 | 0 | 1 | 0 | 10240 |
33 | 13 | 11 | 2 | 0 | 1 | 0 | 12288 |
34 | 13 | 11 | 3 | 0 | 1 | 0 | 14336 |
35 | 13 | 11 | 4 | 1 | 1 | 0 | 16384 |
36 | 14 | 12 | 1 | 0 | 1 | 0 | 20480 |
37 | 14 | 12 | 2 | 1 | 1 | 0 | 24576 |
38 | 14 | 12 | 3 | 0 | 1 | 0 | 28672 |
39 | 14 | 12 | 4 | 1 | 0 | 0 | 32768 |
40 | 15 | 13 | 1 | 1 | 0 | 0 | 40960 |
41 | 15 | 13 | 2 | 1 | 0 | 0 | 49152 |
42 | 15 | 13 | 3 | 1 | 0 | 0 | 57344 |
43 | 15 | 13 | 4 | 1 | 0 | 0 | 65536 |
44 | 16 | 14 | 1 | 1 | 0 | 0 | 81920 |
45 | 16 | 14 | 2 | 1 | 0 | 0 | 98304 |
46 | 16 | 14 | 3 | 1 | 0 | 0 | 114688 |
47 | 16 | 14 | 4 | 1 | 0 | 0 | 131072 |
48 | 17 | 15 | 1 | 1 | 0 | 0 | 163840 |
49 | 17 | 15 | 2 | 1 | 0 | 0 | 196608 |
50 | 17 | 15 | 3 | 1 | 0 | 0 | 229376 |
51 | 17 | 15 | 4 | 1 | 0 | 0 | 262144 |
52 | 18 | 16 | 1 | 1 | 0 | 0 | 327680 |
53 | 18 | 16 | 2 | 1 | 0 | 0 | 393216 |
54 | 18 | 16 | 3 | 1 | 0 | 0 | 458752 |
55 | 18 | 16 | 4 | 1 | 0 | 0 | 524288 |
56 | 19 | 17 | 1 | 1 | 0 | 0 | 655360 |
57 | 19 | 17 | 2 | 1 | 0 | 0 | 786432 |
58 | 19 | 17 | 3 | 1 | 0 | 0 | 917504 |
59 | 19 | 17 | 4 | 1 | 0 | 0 | 1048576 |
60 | 20 | 18 | 1 | 1 | 0 | 0 | 1310720 |
61 | 20 | 18 | 2 | 1 | 0 | 0 | 1572864 |
62 | 20 | 18 | 3 | 1 | 0 | 0 | 1835008 |
63 | 20 | 18 | 4 | 1 | 0 | 0 | 2097152 |
64 | 21 | 19 | 1 | 1 | 0 | 0 | 2621440 |
65 | 21 | 19 | 2 | 1 | 0 | 0 | 3145728 |
66 | 21 | 19 | 3 | 1 | 0 | 0 | 3670016 |
67 | 21 | 19 | 4 | 1 | 0 | 0 | 4194304 |
68 | 22 | 20 | 1 | 1 | 0 | 0 | 5242880 |
69 | 22 | 20 | 2 | 1 | 0 | 0 | 6291456 |
70 | 22 | 20 | 3 | 1 | 0 | 0 | 7340032 |
71 | 22 | 20 | 4 | 1 | 0 | 0 | 8388608 |
72 | 23 | 21 | 1 | 1 | 0 | 0 | 10485760 |
73 | 23 | 21 | 2 | 1 | 0 | 0 | 12582912 |
74 | 23 | 21 | 3 | 1 | 0 | 0 | 14680064 |
75 | 23 | 21 | 4 | 1 | 0 | 0 | 16777216 |
四、相关计算公式
a. 每个内存规格的尺寸计算公式
size = (1 << log2Group) + (1 << log2Delta) * nDelta;
b. 第0组是单独初始化不予考虑, 从第1组开始
log2Group = log2Delta + 2;
c. 通过a,b合并得到
size = 2 ^ log2Delta (4 + nDelta)
d. 从c得到, 自第1组开始组内每个内存大小是logDelta的[ 5,6,7,8 ]倍;
五、结果说明
- 最小尺寸16B, 最大尺寸16M;
- 尺寸分19组, 每组4个, 共76种尺寸(规格, 颗粒度);
- 从第1组开始, 后一组是前一组容量的2倍;
- 组内后一个是在前一个的尺寸基础上+log2Delta;
- 尺寸>=pageSize(8K)的有40个;
- 尺寸小于pageSize(8K)的有36个;
- 这种尺寸作为分配的最小颗粒度, 同时也影响了做实际分配时的空间大小以及对应的最小颗粒度(元素)数量;
六、小结
本篇介绍的是Netty4.1.73-Final的内存规格化, 后续的内存分配均以该内存规格为基础进行。整个尺寸要覆盖小尺寸和大尺寸, 平衡分配效率和空间利用率。这里仅仅介绍了其内存规格化的实现结果, 如此设计的原因和历史的演进, 感兴趣的小伙伴可以去进一步研究Jmelloc项目。
相关文章:
Netty内存管理--内存池空间规格化SizeClasses
一、规格化 内存池类似于一个内存零售商, 从操作系统中申请一整块内存, 然后对其进行合理分割, 将分割后的小内存返回给程序。这里存在3个尺寸: 分割尺寸: 底层内存管理的基本单位, 比如常见的以页为单位分配, 但是页的大小是灵活的;申请尺寸: 内存使用者希望申请到的内存大小…...
数据结构刷题(三十):96不同的二叉搜索树、01背包问题理论、416分割等和子集
一、96. 不同的二叉搜索树 1.这个题比较难想递推公式, dp[3],就是元素1为头结点搜索树的数量 元素2为头结点BFS的数量 元素3为头结点BFS的数量 元素1为头结点搜索树的数量 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量 元素2为头结…...
bash的进程与欢迎讯息自定义
在bash shell中,可以通过多种方式自定义欢迎讯息和提示符。主要有: 修改/etc/profile文件: 该文件在用户登录后执行,定义了PROMPT_COMMAND和PS1提示符。可以修改其内容实现自定义欢迎讯息和提示符。 例如,修改为: bash PROMPT_COMMANDecho -e "\nWelcome to My Bash She…...
本周大新闻|苹果首款MR没有主打卖点;Meta认为AI是AR OS的基础
本周XR大新闻,AR方面,苹果首款MR或没有主打卖点,反而尽可能支持更多App和服务;扎克伯格表示基于AI的AR眼镜操作系统是下一代计算平台的基础;微软芯片工程VP Jean Boufarhat加入Meta芯片团队;Humane展示了…...
Java中工具类Arrays、Collections、Objects
Arrays Arrays是Java中提供的一个针对数组操作的工具类,所有的方法都是静态的。 大致有这些常用的方法 sort()针对常用的基本数据类型,都能进行排序,byte、char、int、long、float、doubleparallelSort()并行排序,多线程排序&am…...
Docker安装Nginx/Python/Golang/Vscode【亲测可用】
一、docker安装nginx docker安装nginx,安装的是最新版本的:docker pull nginx:latest 创建一个容器:docker run --name my-nginx -p 80:80 -d nginx:latest 开启一个交互模式终端:docker exec -it my-nginx bash 创建django项…...
蓝桥杯2022年第十三届决赛真题-最大数字
蓝桥杯2022年第十三届决赛真题-最大数字 时间限制: 3s 内存限制: 320MB 题目描述 给定一个正整数 N。你可以对 N 的任意一位数字执行任意次以下 2 种操作: 将该位数字加 1。如果该位数字已经是 9,加 1 之后变成 0。 将该位数字减 1。如果该位数字已经…...
smbms项目搭建
目录 1.搭建一个maven web项目 2.配置Tomcat 3.测试项目是否能够跑起来 4.导入项目中会遇到的Jar包 5.项目结构搭建 6.项目实体类搭建 7.编写基础公共类 1.数据库配置文件 2.编写数据库的公共类 3.编写字符编码过滤器 3.1web配置注册 4.导入静态资源 1.搭建一个maven web项目 …...
进程/线程 状态模型详解
前言:最近操作系统复习到线程的状态模型(也可以说进程的状态模型,本文直接用线程来说)时候,网上查阅资料,发现很多文章都说的很不一样,有五状态模型、六状态模型、七状态模型.......虽然都是对的…...
数据结构与算法之队列: Leetcode 621. 任务调度器 (Typescript版)
任务调度器 https://leetcode.cn/problems/task-scheduler/ 描述 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间&#…...
【报错】arXiv上传文章出现XXX.sty not found
笔者在overleaf上编译文章一切正常,但上传文章到arxiv时出现类似于如下报错: 一般情况下观察arxiv的编译log,不通过的原因,很多时候都是由于某一行导入了啥package,引起的报错;但是如果没有任何一个具体的…...
项目合同管理
项目合同管理的基本概念及分类、项目合同签订、项目合同管理以及项目合同索赔处理等内容 信息系统工程的建设过程实际上就是合同的执行和监控的过程 1、项目合同的概念及分类 合同法律关系:权力和义务关系 合同可以是书面形式、口头形式和其他形式 书面形式是指…...
聊聊ClickHouse向量化执行引擎-过滤操作
俄罗斯Yandex开发的ClickHouse是一款性能黑马的OLAP数据库,其对SIMD的灵活运用给其带来了难以置信的性能。本文我们聊聊它如何对过滤操作进行SIMD优化。 基本思想 1、有一个数组data,即ColumnVector::data,存放数据 2、使用uint8类型…...
数据可视化第二版-拓展-网约车分析案例
文章目录 数据可视化第二版-拓展-网约车分析案例竞赛介绍 1等奖作品-IT从业者张某某的作品结论过程数据和思考数据处理数据探索数据分析方法选择数据分析相关性分析转化率分析分析结论 完单数量分析分析结论 司机数量分析分析结论 时间分析每日订单分析 工作日各时段分析周六日…...
pytest - Getting Start
前言 项目开发中有很多的功能,通常开发人员需要对自己编写的代码进行自测,除了借助postman等工具进行测试外,还需要编写单元测试对开发的代码进行测试,通过单元测试来判断代码是否能够实现需求,本文介绍的pytest模块是…...
( 字符串) 205. 同构字符串 ——【Leetcode每日一题】
❓205. 同构字符串 难度:简单 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同…...
python+django+vue消防知识宣传网站
开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 层随着移动应用技术的发展,越来越多的消防单位借助于移动手机、电脑完成生活中的事…...
彻底告别手动配置任务,魔改xxl-job!
分析 改造 1、接口调用 2、创建新注解 3、自动注册核心 4、自动装配 测试 测试后 XXL-Job是一款非常优秀的任务调度中间件,其轻量级、使用简单、支持分布式等优点,被广泛应用在我们的项目中,解决了不少定时任务的调度问题。不仅如此&a…...
【五一创作】Springboot+多环境+多数据源(MySQL+Phoenix)配置及查询(多知识点)
文章目录 1. 背景2. 技术点3 子模块依赖SpringBoot设置4. 多环境配置4.1 application.yml4.2 application-pro.yml 5. 多数据源配置5.1 yml配置5.2 自定义数据源在Java中配置5.2.1 PhoenixDataSourceConfig5.2.2 MysqlDataSourceConfig 6. 完整的Pom6. 测试6.1 Mapper配置6.2 方…...
Python小姿势 - 线程和进程:
线程和进程: Python里面线程是真正的并行执行,进程是可以并行执行的。 所谓进程,就是操作系统中执行一个程序的独立单元,它是系统进行资源分配和调度的基本单位。一个进程可以创建和撤销另一个进程,同一个进程内可以并…...
Mysql 锁
目录 0 课程视频 1 概述 1.1 多用户 并发访问 -> 为了数据一致性(多用户) 1.2 全局锁 数据库所有表 1.3 表级锁 每次操作 锁整张表 1.4 行级锁 每次操作 锁对应行 2 全局锁 ->锁后只读 -> 全库逻辑备份 2.1 阻塞DML /DDL 可DQL读 2.2 语法 2.2.1 加锁 flush…...
基于ssm的论坛系统的设计与实现【附源码】
基于ssm的论坛系统的设计与实现 摘 要 早期的网络论坛系统已经诞生一段时间,随着互联网技术的发展,它已经从最初的简单电子公告板系统变成了一种丰富的论坛系统社区模型。人们通过论坛系统进行信息的获取、发布和交流已经成为一种普遍的社交方式&#x…...
Vue中的事件修饰符
Vue中的事件修饰符: 1.prevent: 阻止默认事件 (常用) : 2.stop: 阻止事件冒泡 (常用) : 3.once: 事件只触发一次(常用) : 4.capture:使用事件的捕获模式: 5.self: 只有event.target是当前操作的元素是才触发事件; 6.passive:事件的默认行为立即执行,无需等待事件回调…...
如何保证Redis和数据库的一致性
关注我,升职加薪就是你! 当我们对数据进行修改的时候,到底是先删缓存,还是先写数据库? 1、如果先删缓存,再写数据库:在高并发场景下,当第一个线程删除了缓存,还没来得及写…...
Ubantu docker学习笔记(八)私有仓库
文章目录 一、建立HTTPS链接1.在仓库服务器上获取TLS证书1.1 生成证书颁发机构证书1.2 生成服务器证书1.3 利用证书运行仓库容器 2.让私有仓库支持HTTPS3.客户端端配置 二、基本身份验证三、对外隐藏仓库服务器3.1 在服务器端3.2 在客户端进行 四、仓库可视化 在前面的学习中&a…...
【五一创作】网络协议与攻击模拟-01-wireshark使用-捕获过滤器
协议 TCP/IP协议簇 网络接口层(没有特定的协议)PPPOE 物理层 数据链路层 网络层:IP (v4/v6) ARP (地址解析协议) RARP ICMP (Internet控制报文协议) IGMP 传输层:TCP(传输控制协议) UDP(用户数据报协议) 应用层:都是基于传输层协议的端口,总共端口0~65535 0~1023 HTTP—t…...
网络-IP地址(嵌入式学习)
IP地址 基本概念IPv4 五类:A B C D E特殊地址子网掩码子网号概念IPv6优势举个栗子 基本概念 IP地址是Internet中主机的标识 IP地址(Internet Protocol Address 互联网国际地址)是一种在Internet上的给主机编址的方式,它主要是为…...
一文介绍Linux EAS
能量感知调度(Energy Aware Scheduling,简称EAS)是目前Android手机中Linux线程调度器的基础功能,它使调度器能预测其决策对CPU能耗的影响。依靠CPU的能量模型(Energy Model,简称EM),…...
【五一创作】【Midjourney】Midjourney 连续性人物创作 ① ( 通过垫图方式生成类似图像 )
文章目录 一、Midjourney 生成图像二、通过垫图方式生成类似图像 一、Midjourney 生成图像 Midjourney 可以生成高质量的图像 , 但是 生成过程有很大的随机性 , 输入同样的提示词指令 , 其输出结果也存在很大的不同 ; 如果要 生成稳定的人物角色 , 场景 , 描述连贯的内容 , 这…...
牛客刷题错题记录【03】
链接:https://www.nowcoder.com/questionTerminal/8242fbf4b3a241219989b3e1d0ee82db 来源:牛客网 下列关于Vue和React的描述错误的是( Vue进行数据拦截/代理,对数据更敏感,数据驱动视图自更新,而React需…...
长沙官网网站建设/直播回放老卡怎么回事
基础练习 杨辉三角形 时间限制:1.0s 内存限制:256.0MB问题描述杨辉三角形又称Pascal三角形,它的第i1行是(ab)i的展开式的系数。 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。 下面给出了杨辉三角…...
网站空间下载/网络服务电话
【实例简介】Android使用websocket 进行通讯,推送消息给客户端,实现即时通讯。【实例截图】【核心代码】153473androidWebsocketDemo└── androidWebsocketDemo-master├── README.md├── app│ ├── build.gradle│ ├── libs│ │ └…...
网站弄论坛形式怎么做/百度官网登录
为什么80%的码农都做不了架构师?>>> 衡量程序的标准 衡量一个程序是否优质,可以从多个角度进行分析。其中,最常见的衡量标准是程序的时间复杂度、空间复杂度,以及代码的可读性、可扩展性。针对程序的时间复杂度和空间…...
网站开发需求分析word/免费网站友情链接
之前已经写过一篇关于Lucene安装学习的文章:http://www.cnblogs.com/charlesblc/p/5980525.html 还有一篇关于Solr安装使用的文章:http://www.cnblogs.com/charlesblc/p/5981292.html 上面两篇比较偏实践和应用,开了个头;这一篇是…...
wordpress 新安装 慢/金戈西地那非片
复制文件。 语法 FileCopy源,目标 FileCopy 语句语法包含以下命名参数: 部分说明source必需。 指定要复制的文件的名称的字符串表达式。 _源_可能包含目录或文件夹,和驱动器。目标必需。 指定的目标文件名称的字符串表达式。 _目标_可能包含目…...
公众号可以添加wordpress/企业网站推广有哪些
1、前言 在嵌入式系统开发应用平台中,tftp、nfs和samba服务器是最常用的文件传输工具,tftp和nfs是在嵌入式Linux开发环境中经常使用的传输工具,samba则是Linux和Windows之间的文件传输工具。 samba是模仿Windows网上邻居的SMB的通讯协议&am…...