内存那些事(一)
来源:互联网 发布:全球省市区数据库 编辑:程序博客网 时间:2024/04/30 16:16
开学的时候,就跟同学说,会跟他们讲讲内存的管理,可惜,一直忙着项目的转接手续和实习招聘,并没有得到机会认认真真的准备一个资料给他们,今天,就一个一个写过去吧。
[ps:这个是给自己看的]先规划一个总体的内容:
(一)概述
linux的内存管理
语言的内存管理(c/c++、java、python、go)
容器的内存管理(netty、nginx)
linux的内存管理,
操作系统课上讲的,不多赘述,主要关注slab分配器和伙伴系统,可以复习一下《深入理解linux内核》和《深入理解计算机系统》、《现代操作系统》相关内容,也可以参考这个博文
重点关注大内存的管理和小内存的处理,以及内存回收的处理。伙伴系统是常用的
语言的内存模型 :
c++可以参考这个 : [http://www.cnblogs.com/lancidie/archive/2011/08/05/2128318.html]、顺便参考一下《STL源码解析》
java的呢,看书去吧 :《深入理解java虚拟机》、《java 7 virtual machine specification》
python : 滚去看书和源代码(推荐这个)去吧 《python源代码分析》(这个是老版本的python2.x)
go : 这个看代码嫌太烦的话,可以参考这个c++虽然将内存讲给了工程师管理了,但是new的设计对malloc除了一些处理,分成了大内存分配和小内存分配,小内存分配构成了三级结构(freelist->pool->malloc),使用freelist解决小内存的频繁放入和回收,以256为界,小内存以2的指数幂构成内存分配格局, 更多的内存设计可以参考《STL源码解析》,java的对管理技术不必赘述,java人随口可以说出工作内存和运行时的各种细节,略去;在python中,python为经常使用的int小数提前分配了小数,只要通过引用技术就行了,同时,对各种数据类型的支持还增加了内存池,避免频繁的内存分配和释放;go,资料不足,自己使用不多,可以参考上海4月份的gopher大会,有相关的演讲, 抱歉地址找不到了。
容器的内存管理:
netty看源代码去,重点关注 各种bytebuf相关设计、poolarena、poolchunk、poolchunklist
nginx内存设计:和netty相比,在于chunk的组织方式,nginx纯粹的数组+链表的组织方式,使用freelist链表表示空闲空间,使用bit位表示包含subpage的page中subpage的分配情况,在netty中,使用满二叉树管理page的可用情况(满二叉树还是使用数组+链表),内部也是使用bit位的设计,两者的设计思想基本相同(好像话说的有点满)
容器的设计也是中规中矩,nginx是c代码,自己实现内存管理是情有可原的,netty,为了实现更加高效的管理,也是java里面我至今看到的唯一自己写内存管理的,java容器自己写内存的,之前确实没有见过。
容器的内存设计,相比于语言的设计,大体上是相似的,出入不大。大三上学学习操作系统的时候,也被要求过写过相应的内存管理模块,并没有考虑这么细致,记着以后用
- 内存那些事(一)
- 内存对齐那些事
- 内存管理那些事
- 内存管理那些事
- 内存分区那些事
- 内存那些事
- 内存的那些事
- Session那些事(一)
- 求职那些事一
- Viewport那些事(一)
- 交互那些事(一)
- Java 内存的那些事
- android bitmap内存那些事
- android 内存泄露那些事情之Handler(一)
- JVM那些事儿(一)——jvm内存介绍
- 《明朝那些事》节选一
- Java多线程那些事(一)
- ASP.NET那些事(一)
- Deformable Parts Model (DPM) 检测加速算法简介
- Java 多线程详解
- 正则表达式初级使用
- 连接池详解
- Android数据库 之 SQLite数据库
- 内存那些事(一)
- Object-c:Property Attributes && Variable life time Qualifiers
- HTTP常见错误返回代码
- 第十三周项目一——动物这样叫
- C程序增加自定义的error输出/打印函数
- ios开发-懒加载和模型的封装
- 知乎上炒的沸沸扬扬的阿里内部矛盾
- [Objective-C]多态的方式--重写、重载
- 虚拟机硬盘的UUID