.NET 性能最佳做法:最大程度减少大型对象分配

.NET Core 垃圾回收器在 ASP.NET Core 应用中自动管理内存分配和释放。自动垃圾回收通常意味着开发人员无需担心如何或何时释放内存。但是,清理未引用的对象会占用 CPU 时间,因此开发人员应最大限度减少热代码路径中的对象分配。垃圾回收在大型对象(> 85 K 字节)上成本特别高昂。大型对象存储在大型对象堆上,需要完整(第 2 代)垃圾回收才能清理。与第 0 代和第 1 代回收不同,第 2 代回收需要临时暂停应用执行。频繁分配和取消分配大型对象可能会导致性能不一致。.

建议:

  • 请考虑缓存经常使用的大型对象。缓存大型对象会阻止进行成本高昂的分配。

  • 使用 存储大型数组来池缓冲区。

  • 请勿在热代码路径上分配许多生存期较短的大型对象。

可以通过在 PerfView 中查看垃圾回收 (GC) 统计信息并检查以下内容来诊断内存问题(如前面的问题):

  • 垃圾回收暂停时间。

  • 花费在垃圾回收上的处理器时间百分比。

  • 第 0 代、第 1 代和第 2 代的垃圾回收量。

有关详细信息,请参阅垃圾回收和性能。参考:https://docs.microsoft.com/zh-CN/dotnet/standard/garbage-collection/performance