c# - 堆内存管理.Net

标签 c# .net memory heap-memory stack-memory

当创建 2 个相同类型的对象时,堆栈内存中的句柄会指向堆中的同一个对象还是会指向 2 个不同的对象。为了清楚起见,这里是具体问题......

class Q2 {
   private static int num = 0;
   private String prefix;

   public Q2 (String p)
    { prefix = p; }

   public String Msg (String str) {
      String n;
      num++;   
      n = num.ToString();
     return n + " - " + prefix + str;
   }
}

使用适当的图表,描述执行完以下所有语句后的内存状态。

 Q2 var1, var2;
   var1 = new Q2("Question 2");
   var2 = new Q2 ("Another view");

以下是我无法决定的答案:

1 个对象:

enter image description here

2 个对象:

enter image description here

最佳答案

为了帮助澄清此处关于堆的讨论,CLR 使用了大约 8 种不同的堆:

  1. Loader Heap:包含 CLR 结构和类型系统
  2. 高频堆:静态、方法表、FieldDescs、接口(interface)映射
  3. 低频堆:EEClass、ClassLoader 和查找表
  4. stub 堆:用于 CAS、COM 包装器、P/Invoke 的 stub
  5. 大型对象堆:需要超过 85k 字节的内存分配
  6. GC 堆:用户分配的应用私有(private)堆内存
  7. JIT 代码堆:由 mscoreee(执行引擎)和 JIT 编译器为托管代码分配的内存
  8. 进程/基堆:互操作/非托管分配、 native 内存等

HTH

关于c# - 堆内存管理.Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479529/

相关文章:

具有泛型类型的 C# 属性

delphi - TClientDataSet 不释放内存

c++ - Clion 内存 View

c# - 如何在 C# 中将大二进制字符串转换为十六进制字符串格式?

c# - 如何在 ItemCommand 事件后获取 TextBox 的 Text 属性

c# - 从基类强制转换为继承类时,InvalidCastException?

c# - 为什么 LINQ to objects 方法的顺序很重要

c# - 替换字符串中的 Unicode 转义序列

c# - .NET 中的事件排序

c++ - C++中不同派生类的高效容器