在C#中,托管堆和非托管堆的区别在于,在托管堆中,垃圾回收器回收完废弃的内存后,有一个压缩操作,即在垃圾回收器每次释放了不再被引用的对象后,都会检查堆中的内存分配情况,他会压缩其他对象,把它们都移动会到堆的端部,使所有的未分配内存再次形成一个连续的块。这样,在下次分配新的对象时,计算机就不必去搜索整个堆,以找到足够大的内存来存储新对象。 在移动堆内的对象时,指向这些对象的所有引用都要用新的地址来更新,垃圾回收器会负责处理更新问题,当然这也会带来一定的性能损失。 由于托管的堆中,垃圾回收器具有压缩操作,因此使用托管的堆,就只需要读取堆指针的值即可,而不是搜索链接地址表,来查找一个地方以便放置新对象。 这种能够被垃圾回收器访问管理的堆,我们称为托管堆。反之,通过指针访问,不能被垃圾回收器访问,管理,需要手工管理内存释放的堆,我们成为非托管堆。
C#内存管理之托管堆与非托管堆
最新推荐文章于 2021-10-31 12:01:58 发布