更快地为对象分配内存-sx127x中文数据手册cn

时间:2024-07-29 11:56:38
【文件属性】:

文件名称:更快地为对象分配内存-sx127x中文数据手册cn

文件大小:57.77MB

文件格式:PDF

更新时间:2024-07-29 11:56:38

VisualBasic 2010 .NET4 高级编程 (第6版)

4 .5.2 更快地为对象分配内存 CLR引入了托管堆的概念。在托管堆上分的才象. CLR负责控制以类型安全的方式访问这些对 象。托管堆的一个好处是内存分配非常高效。非托管代码(例如Visual Basic 6或 C忡)在非托管堆上 分配内存时,通常是搜索某个数据结构,获得一段足够大的*空间。托管堆保存了对最近分配的 堆上地址的引用。 如果需要在堆上创建新的对象. CLR首先分配堆顶的内存,然后把引用指向新的 堆顶。图 4-4 表示了.NET 中托管堆的这一过程。 跚 跚 时 量 状态 1: 在难上分 酣愧A、 B 和C 分 部 用 服 刷 刷 栅 阴 阳 〔 宙 状态4: GC运行, 因咖悔 8 占用 的内存二 压缩雄 因4-4 • 状态 1 当前引用指向压缩内存堆的堆顶。 • 状态 2 对象 B不再被引用,但仍然存在于堆中。其内存还没有被释放,因此不会改变其他 对象在堆上内存的分配。 • 状态 3 尽管在对象A和对象C之间有一段空闲内存,对象D 的内存分配仍然在堆顶进行。 分配内存时忽略了托管堆上没有使用的块。 • 状态 4 在一次或多次分配后, 在分配失败前. GC会运行.它收回分配给B 的内存, 并重 新安排其他的有效对象。这会把活动的对象压到堆底,为进一步的内存分配创造空间。 这里将使用垃圾回收器。如果 CLR不能分配托管地t的内存,就会调用 GC. oc 负责回收应 用程序不再引用的对象,并压缩堆。这是很重要的,因为如果 GC 仅清理对象,堆就会逐渐被分为 多个碎片。当堆上的内存块变得比较零碎时,常常会出现内存分配失败的问题,这不是因为没有足 够的空闲内存,而是因为没有足够的连续空闲内存。因此. GC 不仅重新声明与不再引用的对象相 关的内存,还会压缩剩余的对象。 GC 会高效地压缩剩余对象之间的所有空间,释放另一个大的托 管堆,为新对象分配内存。 230


网友评论