什么是堆分配?
堆分配是最灵活的分配方案。内存的分配和释放可以在任何时间和任何地点进行,具体取决于用户的需求。堆分配用于动态地为变量分配内存,当不再使用变量时,将其回收。
堆管理是数据结构理论中的一个专门领域。堆管理器通常会带来一些时间和空间开销。出于效率原因,将特定大小的小型激活记录作为特殊情况处理可能很有用,如下所示:
- 对于每个感兴趣的大小,维护该大小的空闲块的链接列表。
- 如果可能,用大小为 S' 的块来满足大小为 s 的请求,其中 S' 是大于或等于 s 的最小大小。当块被释放时,将其返回到链接列表。
- 对于更大的存储块,使用堆管理器。
堆管理使用两种方法,如下所示:
垃圾回收方法
当所有访问某个对象的路径都被销毁,但数据对象仍然存在时,此类对象被称为垃圾。垃圾回收是一种用于重用该对象空间的技术。
在垃圾回收中,首先,我们标记所有活动对象,所有其余元素(其垃圾回收“开启”)都被视为垃圾并返回到空闲空间列表。
引用计数
通过引用计数,尝试在堆存储的每个元素无法再被访问后立即回收它。
堆上的每个内存单元都关联一个引用计数器,其中包含指向它的值的个数。每次有新的值指向该单元时,计数器加 1;每次某个值不再指向它时,计数器减 1。当计数器变为零时,该单元将返回到空闲列表以供进一步分配。
堆分配的特性
堆分配具有多种特性,如下所示:
- 空间效率- 内存管理器应最大限度地减少程序所需的总堆空间。
- 程序效率- 内存管理器应充分利用内存子系统,以加快程序运行速度。因为执行指令所需的时间会因对象在内存中的位置而异。
- 低开销- 内存分配和释放在许多程序中都是频繁的操作。这些操作必须尽可能高效。也就是说,需要最大限度地减少开销。执行时间中用于执行分配和释放的比例。
广告