我想为Foo创建10个实例
class Program
{
static void Main(string[] args) {
foreach (var _ in Enumerable.Range(1, 10))
{
var foo = new Foo();
}
Console.ReadKey();
}
}
但我用VS2019的诊断工具跟踪堆内存,它只显示1个计数。
为什么Foo类型没有10个计数?在堆中应该有10个Foo的实例内存,但只有一个点到'foo'栈。请给我一些建议,谢谢。
@TaW : 我参考了你的建议,我在循环外创建了10个实例,但诊断工具仍然只在托管堆中显示一个计数。
static void Main(string[] args)
{
Foo foo;
foo = new Foo();
foo = new Foo();
foo = new Foo();
foo = new Foo();
foo = new Foo();
foo = new Foo();
foo = new Foo();
foo = new Foo();
foo = new Foo();
foo = new Foo();
Console.ReadKey();
}
但是诊断工具仍然只显示一个计数在托管堆中。
-----------------------------------另一个发现
我尝试循环100K次来创建Foo实例,并在Foo类型中添加了一个分配1024大小的字节[]。
static void Main(string[] args)
{
foreach (var _ in Enumerable.Range(0, 100000)) {
var foo = new Foo();
}
Console.ReadKey();
}
class Foo
{
private byte[] bytes;
public Foo()
{
bytes = new byte[1024];
}
}
诊断工具仍然在托管堆中显示一个计数,并且没有检测到进程内存中的任何GC。这似乎是行不通的。
我试着用.Net对象分配跟踪来解决这个问题。Debug
-> Performance Profiler
->。.Net Object Allocation Tracking
来监测它。
报告中预计有10万次分配和触发GC。
现在,我更困惑的是两者之间的突出区别。diagnostic tool
和 .Net Object Allocation Tracking
.
foo
是变量--它在栈中对引用有一个固定的位置;然而,每个 new Foo()
是一个不同的对象,在可用的堆空间中的某个地方创建;每次都不同。