- .NET Core 教程
- .NET Core - 主页
- .NET Core - 概述
- .NET Core - 先决条件
- .NET Core - 环境设置
- .NET Core - 入门
- .NET Core - 数值
- .NET Core - 垃圾收集
- .NET Core - 代码执行
- .NET Core - 模块化
- .NET Core - 项目文件
- .NET Core - 包参考
- 使用.NET Core创建UWP应用程序
- .NET 核心 - MSBuild
- .NET Core - 元包
- Windows 运行时和扩展 SDK
- 创建.NET标准库
- .NET Core - 可移植类库
- 添加对库的引用
- 共享 .NET Core 库
- 创建 Xamarin.Forms 项目
- .NET Core - PCL 故障排除
- .NET Core - 创建测试项目
- 在 Visual Studio 中运行测试
- .NET Core - 测试库
- 托管可扩展性框架
- .NET 核心 - SDK
- .NET Core - MSBuild 和 project.json
- 恢复和构建以及 MSBuild
- .NET Core - 迁移
- .NET Core 有用资源
- .NET Core - 快速指南
- .NET Core - 有用的资源
- .NET Core - 讨论
.NET Core - 垃圾收集
在本章中,我们将介绍垃圾收集的概念,它是 .NET 托管代码平台最重要的功能之一。垃圾收集器(GC)管理内存的分配和释放。垃圾收集器充当自动内存管理器。
您不需要知道如何分配和释放内存或管理使用该内存的对象的生命周期
每当您使用“new”关键字声明对象或装箱值类型时都会进行分配。分配通常非常快
当没有足够的内存来分配对象时,GC 必须收集并处置垃圾内存,以使内存可用于新的分配。
这个过程称为垃圾收集。
垃圾收集的优点
垃圾收集提供以下好处 -
您在开发应用程序时无需手动释放内存。
它还可以有效地在托管堆上分配对象。
当对象不再使用时,它将通过清除内存来回收这些对象,并保留内存以供将来分配。
托管对象会自动获取干净的内容来开始,因此它们的构造函数不必初始化每个数据字段。
它还通过确保一个对象不能使用另一个对象的内容来提供内存安全。
垃圾收集的条件
当满足以下条件之一时,就会发生垃圾收集。
系统物理内存不足。
托管堆上分配的对象使用的内存超过了可接受的阈值。该阈值随着进程的运行而不断调整。
GC.Collect方法被调用,并且在几乎所有情况下,您不必调用此方法,因为垃圾收集器连续运行。此方法主要用于特殊情况和测试。
几代人
.NET 垃圾收集器有 3 代,每一代都有自己的堆,用于存储分配的对象。有一个基本原则:大多数对象要么是短命的,要么是长命的。
第一代 (0)
在第 0 代中,首先分配对象。
在这一代中,对象通常不会超过第一代,因为到下一次垃圾收集发生时它们不再使用(超出范围)。
第 0 代的收集速度很快,因为它的关联堆很小。
第二代 (1)
在第一代中,对象有第二次机会空间。
生命周期较短但在第 0 代收集中幸存下来的对象(通常基于巧合的时间)将进入第 1 代。
第一代收集也很快,因为它的关联堆也很小。
前两个堆仍然很小,因为对象要么被收集,要么被提升到下一代堆。
第三代 (2)
在第 2 代中,所有长对象都已存活,并且其堆可能会变得非常大。
这一代中的对象可以存活很长时间,并且没有下一代堆来进一步提升对象。
垃圾收集器有一个用于存储大型对象的附加堆,称为大型对象堆 (LOH)。
它是为 85,000 字节或更大的对象保留的。
大对象不分配到分代堆,而是直接分配到 LOH
对于运行很长时间或处理大量数据的程序来说,第二代和 LOH 收集可能会花费相当长的时间。
众所周知,大型服务器程序的堆大小为数十 GB。
GC 采用多种技术来减少阻塞程序执行的时间。
主要方法是在后台线程上以不干扰程序执行的方式尽可能多地进行垃圾收集工作。
GC 还向开发人员公开了一些影响其Behave的方法,这对于提高性能非常有用。