.net 为什么前台垃圾收集在GC被触发时不进行收集?

oxiaedzo  于 2023-03-09  发布在  .NET
关注(0)|答案(1)|浏览(120)

以下是https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/background-gc的屏幕截图

我们知道后台垃圾收集是在一个或多个专用线程上执行的,这取决于它是工作站还是服务器GC,并且只适用于第2代收集。前台垃圾收集执行第0代和第1代收集
我对这幅画有几个问题:
问题1:线程1中的红色箭头,“init GC”是什么意思?我感觉它的意思是线程1触发了一个GC,但是如果是这样的话,为什么GC线程1和GC线程2不在这个窗口做前台垃圾收集?为什么当应用程序线程1,2,3被挂起时,专用的GC线程没有收集垃圾?
是什么原因导致线程1,2,3再次挂起?我觉得是后台线程1,2在做第二代的收集,挂起线程1,2,3来清理堆对象,但是为什么线程1,2,3恢复后后台线程还在收集(您可以看到红色的BGC线程时间戳比线程1、2、3的蓝色挂起时间戳长)

cdmah0mi

cdmah0mi1#

问题二:
或BGC有2个持续时间,因为每个BGC将暂停两次-一次是初始暂停,第二次是标记阶段结束时(在mem-doc的GC事件序列部分中描述)。
https://devblogs.microsoft.com/dotnet/the-updated-getgcmemoryinfo-api-in-net-5-0-and-how-it-can-help-you/

相关问题