日期:2014-05-17  浏览次数:20904 次

请教下 静态类型、静态成员在内存中如何被分配
1.它们在什么时候被分配内存?
2.被分配在内存中的什么区域?
3.什么时候销毁?
静态类 静态成员

------解决方案--------------------
推测是jit编译时分配内存,在应用程序域卸载时释放,至于分配在哪,反正不可能是堆栈上,那只剩托管堆了

都是猜的,主要是回复下做标记等高手回复
------解决方案--------------------
分配在静态去,程序结束时销毁
------解决方案--------------------
本帖最后由 caozhy 于 2013-08-21 17:29:36 编辑
CLR不存在什么“静态区”,引用对象都是分配在托管堆上的,对象的静态成员分配在方法表后面。程序域装载的时候分配,程序域卸载的时候销毁。对于一般的桌面程序,程序域你可以简单理解为进程启动和关闭,但是对于ASP.NET或者别的单个进程托管了多程序域的情况,还是有区别的。


http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true

静态变量

静态变量是方法表数据结构的重要组成部分。作为方法表的一部分,它们分配在方法表的槽数组后。所有的原始静态类型是内联的,而对于结构和引用的类型的静态值对象,通在句柄表中创建的对象引用来指向。方法表中的对象引用指向应用程序域的句柄表的对象引用,它引用了堆上创建的对象实例。一旦创建后,句柄表内的对象引用会使堆上的对象实例保持生存,直到应用程序域被卸载。在图9 中,静态字符串变量str指向句柄表的对象引用,后者指向GC堆上的MyString。


和JIT也没有关系,JIT只负责把IL编译成本地代码,不管分配内存的事。