【问题标题】:what does it mean memory allocation to an object? [closed]给对象分配内存是什么意思? [关闭]
【发布时间】:2014-01-14 05:54:48
【问题描述】:

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

 A a=new A();

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

2) 类中声明的静态变量和类 A 对象中的方法会发生什么情况。 内存是如何分配给静态变量的以及它们在哪里占用内存?

【问题讨论】:

    标签: c# memory memory-management


    【解决方案1】:

    运行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. newobj instance void Test.A::.ctor()
      调用构造函数,将对象实例分配到堆上,将引用放到栈上
    3. stloc.0
      将堆栈上的第一项(对A的新实例的引用)存储到第0个本地
    4. ret
      从该方法返回后,本地消耗的堆栈空间被回收。由于没有对我们创建的 A 实例的引用,它现在可以进行垃圾回收,以便稍后回收。

    静态成员引用的内存何时被回收

    从不。

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

    进一步学习:

    【讨论】:

    • 所以引用 'a' 也会获得将被垃圾收集器无限期删除的内存..?它是否也在堆中获取内存,或者它在堆栈中获取内存..
    • Reference a 是堆上的内存,它将被无限期地回收,是的。引用 a 在堆栈上。
    • so 引用 'a' 和 object new A() 都将被垃圾收集器无限期回收..
    • 引用,即指针大小的东西,位于堆栈上,并在方法末尾的ret 指令处被回收。对象本身在堆上,可以无限期地回收。
    猜你喜欢
    • 2018-09-13
    • 2013-05-21
    • 1970-01-01
    • 2017-07-27
    • 2010-12-29
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多