【发布时间】:2012-10-19 21:52:39
【问题描述】:
我在 .NET 中阅读了有关 CLR 的信息:
当 CLR 加载时,堆在 SOH 和 LOH 中被分区。
当应用程序启动时,CLR 根据其大小将堆分配给应用程序。
LOH 堆具有 Gen0、Gen1 和 Gen2 区域。
这里A类的所有对象都分配在Gen0上,
问题
- CLR 如何知道应用程序在堆中占用的大小?
-
假设 CLR 为 Gen0 区域分配了 4K 堆内存。鉴于下面的代码,这个单线程是否可以在 Gen0 上使用完整的 4K 内存?
collect = new List(); while(true) { collect.Add(new A()); new A(); new A(); } class A { int a = 0, b = 0; }
【问题讨论】:
-
1.我相信这是通过计算所有声明字段的大小来确定的,考虑到它的类型
-
这是在应用程序启动时在堆上分配所需内存的方式。第二个问题呢?
-
我认为 CLR 会从中查找程序集的元数据,它可以计算所需的堆。我正确吗?
-
LOH 不是世代相传的。它使用一个空闲列表。
标签: c# memory-management .net-4.0 clr