我来自.net,c#background,关于对象的内存分配在我脑海中挥之不去。 我有类似的问题 1)如果我创建一个对象
A a=new A();
其中内存被分配给引用'a'以及如何将内存分配给新的a(),即实际对象以及垃圾收集器如何释放它。
在我的情况new A()
中将内存分配给Object链接时的一部分,只是类变量获取方法的内存,它的变量也获取内存,如果是,它们如何以及在何处获取内存和垃圾收集器释放它们...
2)在类中声明的静态变量和类A的对象中的方法会发生什么。 如何将内存释放到静态变量以及它们占用内存的位置?
答案 0 :(得分:2)
A a = new A();
行时分配了什么内存?首先,请考虑这是一个实现细节,它可能会改变,我可能会遗漏,过度简化和误解以下部分内容,但对于引用类型(class
):
A
类型(元数据)A
静态和类构造函数 A a = new A();
行分为MSIL中的几条说明:
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (class Test.A V_0)
IL_0001: newobj instance void Test.A::.ctor()
IL_0006: stloc.0
IL_0007: ret
}
特别注意:
.locals init (class Test.A V_0)
A
的新实例newobj instance void Test.A::.ctor()
stloc.0
A
的新实例的引用)存储到第0个本地ret
A
实例的引用,现在它有资格进行垃圾回收,以后再回收。从不。
好的......不是真的从不,但接近它。通常,应用程序只有一个运行用户代码的appdomain,但Asp.Net和其他托管应用程序可能有很多。每个应用程序域都维护所有类型信息,因此当您丢弃应用程序域时,会丢弃随之而来的静态。
进一步学习: