堆内存管理 淡淡的烟草味﹌ 2023-10-10 10:11 16阅读 0赞 # 前言: # 最近刚学堆,特写此文巩固一下知识(水平有限,本文可能有错误,望读者留心)。 # 堆的结构: # 在Linux中,堆是使用glibc的ptmalloc2的分配方式,而malloc本质上都是通过brk或mmap实现的。通过brk分配的堆其起始地址在数据段的结尾处,而通过mmap分配的堆起始地址则在数据段后的随机偏移处。 堆主要涉及到3种数据结构: (1):heap\_info,即Heap Header。因为一个thread可以包含多个heap,在当前heap不够用时,系统就会通过mmap分配新的的heap添加到thread arena中,为了便于管理,每个heap都会包含一个heap\_info. heap\_info的数据结构: typedef struct _heap_info { mstate ar_ptr; /* Arena for this heap. */ struct _heap_info *prev; /* Previous heap. */ size_t size; /* Current size in bytes. */ size_t mprotect_size; /* Size in bytes that has been mprotected PROT_READ|PROT_WRITE. */ /* Make sure the following data is properly aligned, particularly that sizeof (heap_info) + 2 * SIZE_SZ is a multiple of MALLOC_ALIGNMENT. */ char pad[-6 * SIZE_SZ & MALLOC_ALIGN_MASK]; } heap_info; (2):malloc\_state,即Arena Header,每个thread只有一个Arena Header,其包含bins,top chunk以及last remainder chunk等。 struct malloc_state { /* Serialize access. */ mutex_t mutex; /* Flags (formerly in max_fast). */ int flags; /* Fastbins */ mfastbinptr fastbinsY[NFASTBINS]; /* Base of the topmost chunk -- not otherwise kept in a bin */ mchunkptr top; /* The remainder from the most recent split of a small request */ mchunkptr last_remainder; /* Normal bins packed as described above */ mchunkptr bins[NBINS * 2 - 2]; /* Bitmap of bins */ unsigned int binmap[BINMAPSIZE]; /* Linked list */ struct malloc_state *next; /* Linked list for free arenas. */ struct malloc_state *next_free; /* Memory allocated from the system in this arena. */ INTERNAL_SIZE_T system_mem; INTERNAL_SIZE_T max_system_mem; }; (3):malloc\_chunk,即Chunk Header,一个Heap被分为多个chunk,这个chunk的大小是由用户申请要分配的空间决定的(实际上chunk的可能大于用户申请分配的空间) 1 struct malloc_chunk { 2 /* #define INTERNAL_SIZE_T size_t */ 3 INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ 4 INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ 5 struct malloc_chunk* fd; /* double links -- used only if free. 这两个指针只在free chunk中存在*/ 6 struct malloc_chunk* bk; 7 /* Only used for large blocks: pointer to next larger size. */ 8 struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */ 9 struct malloc_chunk* bk_nextsize; 10 }; 在glibc malloc中使用bin来管理空闲的chunk,其分为四类:fast bin,unsorted bin,small bin,large bin。 (一):fast bin fast bin的个数只有10个,每一个fast bin都是由一个单链表构成。同一个链表中的所有chunk大小相同。默认情况下(以32位系统为例),每个bin之间按照步进8字节排列,即第一个bin的大小为8字节,第二个bin为16字节,以此类推。fast bin采用LIFO(后进先出)的原则,即最后进入链表的chunk会被最先分配。 fast bin在malloc\_state中的结构为: struct malloc_state { …… …… …… mfastbinptr fastbinsY[NFASTBINS]; //此为数组,用于存放10个fast bin …… …… …… }; 转载于:https://www.cnblogs.com/countfatcode/p/11490111.html
相关 C++内存管理:理解堆、栈、指针,避免内存泄漏 目录 C++内存管理:理解堆、栈、指针,避免内存泄漏 堆与栈的区别 指针与内存泄漏 -------------------- C++内存管理:理解堆、栈、指针,避免 偏执的太偏执、/ 2024年02月17日 13:11/ 0 赞/ 14 阅读
相关 堆内存管理 前言: 最近刚学堆,特写此文巩固一下知识(水平有限,本文可能有错误,望读者留心)。 堆的结构: 在Linux中,堆是使用glibc的ptmalloc2的分 淡淡的烟草味﹌/ 2023年10月10日 10:11/ 0 赞/ 17 阅读
相关 FreeRTOS堆内存管理策略 堆内存管理 本文中超链接的设置指向了官网的链接,方便读者更加深入的了解FreeRTOS的内部机制。 RTOS内部自带了5种内存分配方案,其中方案名称为heap1,hea 你的名字/ 2022年10月06日 12:52/ 0 赞/ 208 阅读
相关 JAVA堆内存管理 JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。 先看下JAVA堆内存是如何 以你之姓@/ 2022年08月30日 11:53/ 0 赞/ 173 阅读
相关 内存堆管理器GenCollectedHeap的初始化 前文在介绍Java对象内存分配的上层接口CollectedHeap时就提过, GenCollectedHeap是一种基于内存分代管理的内存堆管理器实现. 它一方面负责 ╰半夏微凉°/ 2022年08月14日 00:53/ 0 赞/ 157 阅读
相关 【操作系统】堆与内存管理概述 —–要说到操作系统的堆与内存的管理的话,那内容真的是海了去了,从开始的地方就能不停的扩展,但内容的重要性也是不可言喻的,本片博客着重于总结以下三点: 1. Linux的虚拟 短命女/ 2022年06月17日 01:51/ 0 赞/ 250 阅读
相关 【操作系统】堆与内存管理概述 转自: [https://blog.csdn.net/bitboss/article/details/70154146][https_blog.csdn.net_bitboss ﹏ヽ暗。殇╰゛Y/ 2022年04月05日 13:00/ 0 赞/ 217 阅读
相关 Java 堆外内存管理 目录 1.什么是堆外内存? 2.堆外内存有什么优势? 3.堆外内存的使用 3.1堆外内存的设置 3.2堆外内存的创建 3.3堆外内存的回收 3.3.1自动回收 忘是亡心i/ 2022年02月01日 03:41/ 0 赞/ 337 阅读
相关 内存管理——堆与栈 首先看程序例1: include "stdafx.h" include<iostream> using namespace std; int 古城微笑少年丶/ 2021年09月14日 13:24/ 0 赞/ 344 阅读
还没有评论,来说两句吧...