我看到gen 1对象的促销率很高。当我在我的应用程序中启动一个窗口时,第1代中的所有对象都被提升为第2代。我相信它会因调用InitializeComponent()
而发生。如果我对这一行进行评论,那么对象就不会被提升为第2代。对于为什么会发生这种情况有任何想法吗?
答案 0 :(得分:1)
来自here:
垃圾回收中未回收的对象称为 幸存者,并被提升为下一代。对象那个 幸存下来的第0代垃圾收集被提升为一代 1;促进在第1代垃圾收集中存活的对象 第2代;和在第2代垃圾中存活的物体 集合保留在第2代。当垃圾收集器检测到时 在一代人的生存率很高,它增加了 该代的分配门槛,所以下一个集合 获得了相当大的回收内存。 CLR不断 平衡两个优先级:不让应用程序的工作集得到 太大了,不要让垃圾收集花费太多时间
所以我认为最初的阈值相当低,InitializeComponent
会触发大量的分配,强制至少两个集合(因此将第一个对象推广到第2代)。可能GC会检测到它并增加阈值,并且在物体无法轻易到达第2代之后。所以基本上它看起来像应用程序生命周期的早期阶段的人工制品(当事情正在调整时)。
这里的主要问题是你的申请是否有问题?你有性能问题吗?还是其他什么?或者只是出于好奇?
我可以使用性能监视器轻松验证(或揭穿)我的假设,如here所述。你只需看看计数器,看看会发生什么。看看几代人收集了多少收藏品,生存率是多少。