.net 垃圾收集推广率高

.net 垃圾收集推广率高,.net,wpf,.net,Wpf,我看到第1代产品的推广率很高。当我在应用程序中启动窗口时,gen 1中的所有对象都会升级到gen 2。我相信这是由于调用了InitializeComponent()。如果我注释掉这一行,对象不会升级到gen 2。你知道为什么会这样吗?来自: 在垃圾收集中未回收的对象称为 幸存者,并被提升到下一代。反对 在第0代中生存垃圾收集升级到第1代 1.在第1代垃圾回收中幸存的对象将被提升 第2代;以及在第2代垃圾中存活下来的对象 第2代仍保留该系列。当垃圾收集器检测到 一代人的存活率很高,这增加了 该生成

我看到第1代产品的推广率很高。当我在应用程序中启动窗口时,gen 1中的所有对象都会升级到gen 2。我相信这是由于调用了
InitializeComponent()
。如果我注释掉这一行,对象不会升级到gen 2。你知道为什么会这样吗?

来自:

在垃圾收集中未回收的对象称为 幸存者,并被提升到下一代。反对 在第0代中生存垃圾收集升级到第1代 1.在第1代垃圾回收中幸存的对象将被提升 第2代;以及在第2代垃圾中存活下来的对象 第2代仍保留该系列。当垃圾收集器检测到 一代人的存活率很高,这增加了 该生成的分配阈值,因此下一个集合 获取大量回收内存。CLR不断地更新 平衡两个优先级:不让应用程序的工作集 太大,不让垃圾收集花费太多时间

因此,我认为最初的阈值相当低,并且
InitializeComponent
触发了大量的分配,强制执行至少两个集合(因此将第一个对象升级到gen 2)。可能GC会检测到它并增加阈值,而在对象到达gen 2之后就不会那么容易了。所以,基本上它看起来像是应用生命周期早期阶段的产物(当事情正在调整时)

这里的主要问题是,这是否是您的应用程序的问题?您是否有性能问题?还是别的什么?还是仅仅出于好奇


如前所述,通过使用性能监视器,我的假设可以很容易地得到验证(或揭穿)。你只要看看柜台,看看会发生什么。看看几代人中发生了多少次收集,存活率是多少。

添加一些相关代码将大有帮助!窗户看起来像什么?许多控件?该应用程序是否运行任何其他初始化代码?是的,我们存在性能问题,因为我们的所有对象都升级到gen 2,当发生完全gc时,系统会在几分钟内无响应。我知道gen 2系列非常昂贵。我想看看是否有办法避免在生命周期的早期将对象升级到gen2。@user2720165在初始化Component之前避免创建太多对象如何?这是一个很好的观点。出于好奇,InitializeComponent()为什么要创建这么多的对象?@user2720165因为它做了很多事情,所以会加载所有组件。这的确是一个沉重的功能。另一个选择是尝试切换到并发GC,理论上它不应该挂起你的应用。@user2720165你可以一直只做InitializeComponent(),然后显示一些等待屏幕,同时创建你的所有对象。