0x08

动态内存分配

造成堆利用率很低的主要原因是一种成为碎片的现象。

内部碎片是在一个已分配块比有效载荷大时发生的。一个分配器的实现可能对已分配块强加一个最小的大小值,而这个大小要比某个请求的有效载荷大。在任何时刻,内部碎片的数量只取决于以前请求的模式和分配器的实现方式。

外部碎片是当空闲内存合计起来足够满足一个分配请求,但是没有一个单独的空闲块足够大可以来处理这个请求时发生的。

垃圾收集

垃圾收集器将内存视为一张有向可达图,该图的节点被分成一组根节点和一组堆节点。每个堆节点对应于堆中的一个已分配块。有向边p->q意味着块p中的某个位置指向块q中的某个位置。根节点对应于这样一种不在堆中的位置,它们中包含指向堆中的指针。这些位置可以是寄存器、栈里的变量,或者是虚拟内存中读写数据区域内的全局变量。

当存在一条从任意根节点触发并到达p的有向路径时,节点p是可达的。在任何时刻,不可达节点对应于垃圾,是不能被应用再次使用的。

Mark&Sweep垃圾收集器由标记阶段和清除阶段组成,标记阶段标记出根节点的所有可达的和已分配的后继,而后面的清除阶段释放每个未被标记的已分配块。块头部中空闲的低位中的一位通常用来表示这个块是否被标记了。

posted @ 2022-03-29 15:50  Pannnn  阅读(687)  评论(0)    收藏  举报
-->