内存管理类实例

我怀疑.Net中的内存管理。 根据我的理解,记忆被分配并恢复如下:

  • 对于所有值类型,框架将在堆栈中分配内存。

  • 对于所有的参考类型,内存将被分配到堆中,然后由GC进行刷新或管理。

  • 对于在堆栈中分配的内存,当执行完成时,内存将在LIFO方法中清除。
  • 我怀疑是在下面的情况:

    Class MathLibrary{
    
    int number1;
    int number2;
    
    public int computesum(){
        return number1 + number2;
    }
    

    }

    MathLibrary maths = new MathLibrary(); // Class instance
    

    内存分配如何发生在这里,我理解这个对象(数学)的引用将被存储在堆栈中,并且实际的内存将被分配到堆中。 如果那么,分配给值类型(两个整数变量)和方法定义的内存在哪里。


    对于所有值类型,框架将在堆栈中分配内存。

    这并非总是如此。 如果值类型是在方法中声明的,它将会在堆栈中。 如果它是一个类级别的变量,它将在堆上,因为拥有它的对象被分配在堆上。

    因此,对于MathLibrary,这两个整数也会堆在一起,因为它们是该对象的字段。

    对于所有的参考类型,内存将被分配到堆中,然后由GC进行刷新或管理。

    是的,这是真的。 然而,这里需要记住的一件重要事情是该对象将被分配到堆上,但如果该对象是在方法内创建的,则该对象的引用将位于堆栈上。 实际的对象将在堆上。 例如:

    public void Foo()
    {
       Foo f = new Foo();
    }
    

    引用“f”将在栈上,但引用所引用的实际对象将位于堆上。


    那么你对价值类型的理解是错误的! 通常有两条黄金法则:

  • 引用类型将在堆上分配。
  • 值类型和指针(对其他对象的引用)将在它们被声明的地方被分配,而不总是在堆栈上!
  • 此外,还有StackHeap这两个事实:

  • Stack负责跟踪我们代码中执行的内容(方法调用,传递参数,...)。
  • Heap负责跟踪对象。
  • 因此,在你的例子中,两个值类型(number1和number2)都是在一个引用类型的类中声明的,所以作为你的类的一个实例的对象将被分配在Heap因为这两个值类型都会被分配! 由于maths对象实际上是对实际对象的引用,它完全取决于它的声明位置! 举例来说,如果它是在方法声明, Stack将负责保持一个什么样的被称为磁道,所以maths引用将驻留在堆栈并指向实际对象Heap 。 但是如果它被声明为实例成员,它将驻留在Heap

    链接地址: http://www.djcxy.com/p/79143.html

    上一篇: Memory Management for Class Instance

    下一篇: Function variables stored on heap or stack in address space?