原创 启明南
转自启明南微信公号
开发过程中会不可避免要去申请内存,常见的操作如malloc/free、new/delete,这些操作的本质都是向OS申请内存,会经历从用户态进入内核态再回到用户态的过程,态切换成本比较昂贵。内存池的出现就是为了解决这个问题,将申请内存的操作在应用层消化掉。
讲GC算法为什么要讲内存池呢?因为GC算法与内存密不可分。拿JVM举例,可以说JVM的内存结构是它所支持的GC算法决定的,也可以说因为这样的内存结构,GC算法就得这样写。比如G1前所有的GC算法都是基于新生代、老年代这样的内存结构去实现算法的,反过来说,因为GC算法要这样写,我的内存结构得设计成这个样子。G1及之后出现的GC算法都是基于Region实现的,是新一代的GC算法,应该会是未来很多年的一个趋势。
这节课将分享我写好的内存池,是后面讲GC算法的前置课程,希望读者能充分消化掉,最好能自己写一遍。源码获取方式:关注本公众号后回复「垃圾回收算法」
内存池的相关概念
每个人实现的内存池算法不一样,定义的名也不一样,下面这些名词是我写的内存池中使用的名词OS Heap
操作系统堆区,只要是向OS申请内存,都是在这个区分配
Memory Pool
内存池对象,用于管理所有分配的内存块(Memory Chunk)
Memory Chunk
内存块对象,所有的分配内存操作实际上就是在内存块上面切出小内存块给应用程序
Memory Cell
专门用于记录每个小内存块的信息,比如可用内存块信息(从哪到哪,还有多大内存可用)、已用内存块信息(从哪到哪,多大内存被用 了,GC时还会检测该内存块有没有打标记来决定是否回收该块内存)
所以它们之间的关系是一层一层的包含关系,读者一定要深刻理解它们之间的关系,这对于理解GC算法非常关键。
核心算法讲解
逻辑简单的方法我就不展开讲了,源码上都有注释,我把分配内存的步骤详细讲一下
内存池
1、数据结构
2、相关功能:创建内存池、释放内存池、创建内存块、查看所有内存块、释放所有内存块
内存块
1、数据结构
2、相关功能:除了分配内存(malloc),其他都是对属性的操作以及辅助调试方法
3、分配内存
pvoid MemoryChunk::malloc(uint size){ pvoid ret =NULL;if(0== size) { ERROR_PRINT("申请的内存大小不得等于0\n");exit(1); } uint cell_num = ((size -1) / m_align_size) +1;if(cell_num > m_cell_num) { ERROR_PRINT("需要的内存(%d字节)超过最大可用内存(%d字节)\n", size, m_size);exit(1); }/** * 遍历available_table查找满足条件的MemoryCell */list::iterator available_iterator;for(available_iterator = m_available_table.begin(); available_iterator != m_available_table.end(); available_iterator++) { MemoryCell *cell = *available_iterator;if(cell->get_size() >= cell_num) { cell->to_string("找到了满足条件的Cell"); ret = real_malloc(cell, cell_num); } }if(NULL== ret) { ERROR_PRINT("没有满足条件的Chunk,无法分成内存,程序退出\n");exit(1); } print_all_table();returnret;}
Memory Cell
1、数据结构
2、相关功能:基本都是对属性的操作以及辅助调试方法
视频地址
本篇文章相关的视频已出(点个关注,然后视频里面有:手写垃圾回收算法),在视频中演示了我实现的所有GC算法及还未完全完工的JVM,这些内容敬请期待。
各位读者朋友在阅读源码或实践的过程中有任何疑惑可留言或私信,我会抽时间一一回复
觉得写得不错的,请微信搜索【启明南】公众号,跟我一起手写jvm
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容