2012-01-24 98 views
2

程序中的内存分配:代码和数据。堆栈。堆。在.NET中如何将内存分配给全局变量?

如果我有一个静态/全局变量(可以说是一种基元类型),那么理论就会建议当编译的程序被加载时分配内存(在这个例子中忽略动态链接和加载,并假设程序包含一个模块)。

但是如果全局变量是一个引用类型呢?运行时是否调整代码/数据区域的内存分配?或者,引用仅存在于代码/数据区域中,并指向堆中的内存区域?

回答

3

静态变量从AppDomain中的装载机堆由JIT编译器分配的IL时,将其转换成机器代码。它直接将地址编译成代码,非常高效。它一直存在,直到AppDomain卸载时堆被销毁。这不是一个GC堆,变量地址永远不会改变。

如果是引用类型的变量,那么你写了一些代码后运行初始化变量。它将垃圾收集堆中的一块内存地址存储到变量中。然后,它就像垃圾收集器的任何其他引用一样处理,在堆压缩时更新值。当然如果你没有明确地给变量赋一个空值的话,被引用对象最终会出现在第2代中的可能性非常高。

6

静态变量被存储在堆中,而不管它们是否引用类型或值类型中声明。总共只有一个插槽,无论创建多少个实例。

这堆是从正常垃圾收集堆中分离 - 它被称为一个“高频堆”,并有每个应用程序域之一。

检查这个帖子Static variable demystified