我一直在研究一个C#服务器应用程序中的垃圾回收问题,目前正在使用PerfView解决此问题。收集了一些数据并获得了大量GC统计信息后,我对其中一个列“触发原因”感到有些困惑。我得到的两个值是“AllocLarge”和“AllocSmall”。我已经查阅了帮助文档和谷歌,但无法找到这两个术语的确切含义。
我一直在研究一个C#服务器应用程序中的垃圾回收问题,目前正在使用PerfView解决此问题。收集了一些数据并获得了大量GC统计信息后,我对其中一个列“触发原因”感到有些困惑。我得到的两个值是“AllocLarge”和“AllocSmall”。我已经查阅了帮助文档和谷歌,但无法找到这两个术语的确切含义。
.NET的垃圾收集器(GC)对比其他对象(小对象),会以非常不同的方式处理大于85K的对象(大对象)。特别地,只有在“第二代”(最昂贵的GC类型)中才会收集大型对象。如果在分配大型对象时触发了GC(因此必须引发Gen 2 GC),则“AllocLarge”表示此情况。如果在响应“普通”对象的分配时发生了GC,则“AllocSmall”表示这种情况。
请注意,通常拥有短寿命的大型对象是不好的(因为这些对象会强制进行昂贵的GC)。您可以通过查看“GC Alloc Stats”视图并寻找伪框架“LargeObject”来查看分配大型对象的位置。双击该视图(跳转到“调用者”视图),您将看到您分配大型对象的位置。