什么是对象的内存分配?

时间:2014-01-14 05:54:48

标签: c# memory memory-management

我来自.net,c#background,关于对象的内存分配在我脑海中挥之不去。 我有类似的问题 1)如果我创建一个对象

 A a=new A();

其中内存被分配给引用'a'以及如何将内存分配给新的a(),即实际对象以及垃圾收集器如何释放它。 在我的情况new A()中将内存分配给Object链接时的一部分,只是类变量获取方法的内存,它的变量也获取内存,如果是,它们如何以及在何处获取内存和垃圾收集器释放它们...

2)在类中声明的静态变量和类A的对象中的方法会发生什么。 如何将内存释放到静态变量以及它们占用内存的位置?

1 个答案:

答案 0 :(得分:2)

运行第A a = new A();行时分配了什么内存?

首先,请考虑这是一个实现细节,它可能会改变,我可能会遗漏,过度简化和误解以下部分内容,但对于引用类型(class):

  • 为引用A类型(元数据)
  • 分配了内存
  • A静态和类构造函数
  • 的jitted代码分配了内存
  • 一旦静态构造函数运行,就会为任何静态成员(在堆上)分配内存

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
}

特别注意:

  1. .locals init (class Test.A V_0)
    我们首先在堆栈上分配一个本地,以便我们将接收到A的新实例
  2. 的参考
  3. newobj instance void Test.A::.ctor()
    调用构造函数,在堆上分配对象实例并将引用放在堆栈上
  4. stloc.0
    将第一个项目(对A的新实例的引用)存储到第0个本地
  5. ret
    从此方法返回后,将回收本地消耗的堆栈空间。由于没有对我们创建的A实例的引用,现在它有资格进行垃圾回收,以后再回收。
  6. 静态成员引用的内存何时被回收

    从不。

    好的......不是真的从不,但接近它。通常,应用程序只有一个运行用户代码的appdomain,但Asp.Net和其他托管应用程序可能有很多。每个应用程序域都维护所有类型信息,因此当您丢弃应用程序域时,会丢弃随之而来的静态。

    进一步学习: