C#内存管理

一、内存泄漏

     在类型安全的代码,一般内存不会被破坏,但是也可能造成内存泄漏的情况:

  1、在集合中添加对象,即使这些对象不被使用,也不回收。

  2、静态字段引用某个集合对象,然后往集合里添加数据。

二、new托管堆分配对象

  1、进程初始化时,CLR划分一块地址空间作为托管堆,如果托管堆被非垃圾对象填满后,CLR会划分更多区域。

  2、为了托管堆正常工作,CLR维护了一个指针,姑且命名为NextObjPtr,指向下一对象的初始位置。

  3、new操作符

    1)、计算对象的所需字节数:(自身+父类)所有字段的字节数,(类型对象指针+同步块索引)所需字节。

    2)、CLR检查区域空间并放入对象:如果足够,在NextObjPtr指向位置放入对象,初始化各字段内存;如果不够就执行垃圾回收;如果垃圾回收还不够,就开辟更多空间。

    3)、调用构造函数,根据对象内存更新NextObjPtr指针位置,指向下一对象在堆中的位置。

    4)、new操作符返回对象引用。

三、托管堆优点

  分配对象快,只需要指针加上一个值就行。

  访问速度快,因为分配的内存是聚集在较小的连续的区域中。

  强关联的对象会连续分配:BinaryWriter对象需要分配FileStream,这些对象可以连续分配。

四、引用计数算法

  堆里有个计数字段:为每个对象统计引用次数,如果对象不再被使用,计数字段为0,内存就会被回收。

  缺点:循环引用可能会导致内存泄漏,需要其他手段辅助,如弱引用。

五、引用跟踪算法

  关心引用类型,包括静态的、实例的、方法参数和局部变量

posted @ 2022-02-11 10:03  江境纣州  阅读(295)  评论(0编辑  收藏  举报