内存那些事(一)

本文详细阐述了Linux内存管理、多种编程语言内存管理机制、容器内存管理及其实现细节,包括Slab分配器、伙伴系统、STL源码解析、Java虚拟机、Python内存池、Go内存管理等。同时,对比分析了Netty和Nginx在内存设计上的异同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开学的时候,就跟同学说,会跟他们讲讲内存的管理,可惜,一直忙着项目的转接手续和实习招聘,并没有得到机会认认真真的准备一个资料给他们,今天,就一个一个写过去吧。
[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容器自己写内存的,之前确实没有见过。
容器的内存设计,相比于语言的设计,大体上是相似的,出入不大。大三上学学习操作系统的时候,也被要求过写过相应的内存管理模块,并没有考虑这么细致,记着以后用

写给自己看 2015/5/31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值