- .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 Core - MSBuild
- .NET Core - 元包
- Windows 运行时和扩展 SDK
- 创建 .NET Standard 库
- .NET Core - 可移植类库
- 向库添加引用
- 共享 .NET Core 库
- 创建 Xamarin.Forms 项目
- .NET Core - PCL 故障排除
- .NET Core - 创建测试项目
- 在 Visual Studio 中运行测试
- .NET Core - 测试库
- 托管可扩展性框架
- .NET Core - 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)
在第 1 代中,对象有第二次机会空间。
短暂但能幸免于第 0 代收集的对象(通常基于偶然的时机)进入第 1 代。
第 1 代收集速度也很快,因为其关联的堆也很小。
前两个堆保持较小,因为对象要么被收集,要么被提升到下一代堆。
第三代 (2)
在第 2 代中,所有长对象都存活,其堆可能会变得非常大。
本代中的对象可以存活很长时间,并且没有下一代堆来进一步提升对象。
垃圾回收器还有一个用于大型对象的额外堆,称为大对象堆 (LOH)。
它保留给大小为 85,000 字节或更大的对象。
大对象不会分配给分代堆,而是直接分配给 LOH。
第 2 代和 LOH 收集对于运行时间较长或处理大量数据的程序来说可能需要花费大量时间。
已知大型服务器程序的堆大小为数十 GB。
GC 使用各种技术来减少其阻塞程序执行的时间。
主要方法是在后台线程上尽可能多地执行垃圾回收工作,这样就不会干扰程序执行。
GC 还提供了一些方法供开发人员影响其行为,这对于提高性能非常有用。