龙空技术网

八分钟,了解.Net 垃圾回收器优点,基本原理和使用场景

愤怒的苹果盘 105

前言:

眼前各位老铁们对“net垃圾回收机制原理”大概比较关怀,朋友们都想要知道一些“net垃圾回收机制原理”的相关文章。那么小编也在网摘上搜集了一些对于“net垃圾回收机制原理””的相关资讯,希望小伙伴们能喜欢,小伙伴们快快来了解一下吧!

相较于C++开发者,.NET开发者无疑幸福的。强大的.NET平台,提供了许多便捷的封装与完善的机制。垃圾回收器(GC),作为一个隐形的存在,开发者尽可能的专注于业务开发,而不是还要顾虑内存是否还足够大,是否溢出等等问题。

背景

在.NET底层机制在公共语言运行时(CLR)中,每个进程独享自己的虚拟地址空间。同一计算机上所有进程共享相同物理内存。而在一台32位计算机上,每个进程则默认有2GB虚拟地址空间,开发人员在这2GB虚拟内存基础上进行应用程序开发(一般情况不建议操作物理内存)。如果不对内存进行碎片整理,内存会很快被耗尽(1.真实耗尽,2.无可用连续内存块,开辟足够大的内存空间,来存储对象)。

触发条件操作系统发出警告,物理内存不足。托管堆上的对象超出内存可接受的阈值。手动调用GC的回收方法。机制

分代回收。

第0代。常见于短生命周期对象,临时变量。垃圾回收最多见于此代。

第1代。此代为短生存期对象并用作短生存期对象和长生存期对象之间的缓冲区。

第2代。长生命周期对象。基本上是应用程序中静态数据对象。

第0代的空间约为256KB,第1代约为2M,第2代约为10M。新构造的对象会被分配到第0代。当第0代的空间满时,垃圾回收器启动回收,部分未回收的对象,即存活的对象被归为第1代,逐级递推。当垃圾回收器检测到某个代中的幸存率很高时,它会增加该代的分配阈值,因此下一次回收将会获取一个非常大的回收内存。 CLR 会在以下两个优先级别之前进行平衡:不允许应用程序的工作集获取太大内存以及不允许垃圾回收花费太多时间。

具体阶段

标记阶段,找到并创建所有活动对象的列表。重定位阶段,用于更新对将要压缩的对象的引用。压缩阶段,用于回收由死对象占用的空间,并压缩幸存的对象。 压缩阶段将垃圾回收中幸存下来的对象移至段中时间较早的一端。

通过以上机制, 垃圾回收器的优化引擎会根据所执行的分配来确定执行回收的最佳时机, 执行回收,垃圾回收器会在托管堆中检查应用程序不再使用的对象,然后执行必要的操作来回收其内存。

优点让开发者在开发的时候,专注于开发应用程序,而不必手动释放内存。帮助开发者回收不再使用的对象,清楚垃圾对象的内存。将开辟出来的内存用于将来分配。帮助开发者自动管理托管堆。(确保对象的内存不会交叉引用,保证内存安全)问题

1. 非托管代码的存在

该用using闭包的,没有使用,没有dispose掉,

2.使用不安全的C++代码时,可能导致这个问题。

3. 静态全局变量

这些变量一般来说在进程的整个生命周期中将一直存在。特别是一些集合如ArrayList,它们的增长也将会导致内存泄漏问题。

调用方式

标签: #net垃圾回收机制原理