我看到第一代对象的推广率很高。当我在我的应用程序中启动一个窗口时,第 1 代中的所有对象都被提升为第 2 代。我相信这是由于调用InitializeComponent()
. 如果我将此行注释掉,则对象不会提升到第 2 代。关于为什么会发生这种情况的任何想法?
问问题
216 次
1 回答
1
从这里:
在垃圾回收中未回收的对象称为幸存者,并被提升到下一代。在第 0 代垃圾收集中幸存的对象被提升到第 1 代;在第 1 代垃圾收集中幸存的对象被提升到第 2 代;并且在第 2 代垃圾收集中存活的对象保留在第 2 代中。当垃圾收集器检测到某代中的存活率很高时,它会增加该代的分配阈值,因此下一次收集会获得相当大的回收内存. CLR 不断平衡两个优先级:不让应用程序的工作集变得太大,不让垃圾收集花费太多时间
所以我认为会发生什么,最初的阈值相当低,并InitializeComponent
触发大量分配,强制至少两个集合(因此将第一个对象提升到第 2 代)。可能 GC 会检测到它并增加阈值,并且在对象不会那么容易到达第 2 代之后。所以基本上它看起来像是应用程序生命周期早期阶段的人工制品(当事情正在调整时)。
这里的主要问题是它是否对您的应用程序有问题?你有性能问题吗?还是别的什么?还是只是出于好奇?
我的假设可以通过使用性能监视器轻松验证(或揭穿),如此处所述。你只需看看柜台,看看会发生什么。看看几代人收集了多少,存活率是多少。
于 2013-09-17T17:20:33.260 回答