内存管理十分复杂的,即使在托管框架(如 .NET)中也是如此。 分析和了解内存问题可能极具挑战性。
- 撰写动机来自许多内存泄漏和 GC 未正常工作问题。 其中大多数问题都是由于不了解 .NET Core 中的内存消耗工作方式或不了解其度量方式所导致。
- 演示了有问题的内存使用,并提出了替代方法。
垃圾回收 (GC) 在 .NET Core 中的工作方式
GC 会分配堆段,其中每个段都是一系列连续的内存。 置于堆中的对象归类为 3 个代系之一:0、1 或 2。 代系可确定 GC 尝试在应用不再引用的托管对象上释放内存的频率。 编号较低的代系会更加频繁地进行 GC。
对象会基于其生存期从一个代系移到另一个代系。 随着对象生存期延长,它们会移到较高代系。 如前所述,较高代系进行 GC 的频率较低。 短期生存的对象始终保留在第 0 代中。 例如,在 Web 请求存在期间引用的对象的生存期较短。 应用程序级别单一实例通常会迁移到第 2 代。
当 ASP.NET Core 应用启动时,GC 会: