Управление кучей памяти .Net - PullRequest
6 голосов
/ 12 декабря 2011

При создании 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

Ответы [ 4 ]

4 голосов
/ 22 августа 2012

Чтобы прояснить обсуждение кучи, существует около 8 различных куч, которые использует CLR:

  1. Куча загрузчика: содержит структуры CLR и систему типов
  2. HighЧастотная куча: статика, MethodTables, FieldDescs, карта интерфейса
  3. Низкочастотная куча: EEClass, ClassLoader и таблицы поиска
  4. Stub Heap: заглушки для CAS, оболочек COM, P / Invoke
  5. Куча больших объектов: выделение памяти, для которой требуется более 85 Кбайт
  6. Куча GC: выделенная пользователем память кучи, приватная для приложения
  7. Куча кода JIT: память, выделенная mscoreee (механизм выполнения) иJIT-компилятор для управляемого кода
  8. Process / Base Heap: взаимодействие / неуправляемые выделения, собственная память и т. д.

HTH

3 голосов
/ 12 декабря 2011

Вы используете ключевое слово new для создания экземпляров объектов в двух отдельных переменных, поэтому всегда создается новый объект в куче. Поэтому ответом будет то, что он всегда будет указывать на два отдельных объекта.

EDIT : Статические переменные, такие как num, хранятся в специальной области в куче, которая называется High Frequency Heap , которая не собирается сборщиком мусора и т. Д.

2 голосов
/ 12 декабря 2011

Из MSDN :

Существует только одна копия статического члена, независимо от того, сколько экземпляров класса создано.

Итак, поскольку ваш класс не является статичным, вы получите несколько экземпляров вашего класса, но они будут ссылаться на один и тот же, общий, статический экземпляр члена.

Примечание : Вы должны быть ОЧЕНЬ осторожны с кодом, подобным приведенному выше, потому что вы можете получить несколько экземпляров класса, изменяющих значение общего статического члена, что может привести к непредвиденному поведению, состоянию гонки, повреждениям и т. Д.

Если вашНамерение состоит в том, чтобы класс был общим синглтоном, а затем пометьте сам класс как статический, чтобы в любой момент времени в вашей куче был только один.

1 голос
/ 12 декабря 2011

.Net никогда не будет автоматически объединять похожие объекты.

...