因此,在某些代码中,我一直在追踪我认为过多的GC。我最终将其归结为以下代码,该代码显示了我所看到的内容:
object[] ret = new object[40000000];
for (int i = 0; i < 40000000; i++)
{
ret[i] = new object();
}
在运行该循环时,我看到了数十个垃圾收集Gen1事件。有人对这是为什么有很好的了解吗?填充此数组时会清除哪些不再引用的对象?
以下是图片,供您参考:https://imgur.com/a/z3PBtou
在丢失对创建的对象的引用之前,我不会期望发生任何GC。也许我今天已经死了,或者我缺少一些基本概念,但这对我来说很好奇。
谢谢!
答案 0 :(得分:2)
仅仅因为它运行了gen1并不意味着它收集了任何东西,而是意味着它尝试了(正是因为您分配了很多对象!)。直到尝试才知道它是否会成功。
在丢失对我创建的对象的引用之前,我不希望发生任何GC。
不, GC 收集不可访问的对象,但是它会在适当的时候运行(运行(例如,基于分配-或由于操作系统的外部内存压力)。