最近遇到一个问题,应用的内存占用升上去后一直降不下来,打了dump文件后发现GC的Generation 0上有很多空白区间没释放,按道理第0代堆是经常回收的,怎么会有那么多空白区间呢?
查阅了相关文档后,发现这是由代码中的System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.SustainedLowLatency导致。
原本以为SustainedLowLatency只会影响GC第2代堆的回收,但翻阅了文档后,SustainedLowLatency会让堆的空间变大,并且没有内存压力的时候不会去压缩堆的空间,这样会导致更多碎片,这也解释了为什么我会遇到这个Generation 0上这么多空白区间没压缩。MSDN原文如下,可参阅https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/latency
后续移除了SustainedLowLatency模式后,应用的内存虽然有涨上去但是会很快降下来,正常触发了GC,而不是等到感知内存压力后才触发GC。
标签:Generation,System,空白,SustainedLowLatency,GC,内存,NET From: https://www.cnblogs.com/maomaohere/p/17988003