Что происходит со статической функцией, возвращающей строковый массив Visual C #?

1

У меня есть статическая функция, которая возвращает массив строк. Я вызываю эту функцию из цикла и сохраняю возвращаемое значение во временном массиве. Мой вопрос в том, собирается ли GC очистить это в первом поколении или он остался бы и повесился бы как поколение 2.

Ниже вы можете увидеть фрагмент кода.

-----------UPDATED CODE----------------------------

Спасибо за весь ответ. Скажем, у меня будет что-то вроде этого, это очистит строковые массивы?

    public static string[] SplitString(string strLine_)
    {
        string[] bit_ = strLine_.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
    return bit_;
    }

/ / ------inside отличается function--------------//

   private void Foo()
   {
       while (numOfVolElts > count)
       {
           line = sr_.ReadLine();

            if (!string.IsNullOrEmpty(line))
            {
                string[] bit4 = Definitions.SplitString(line);
                for (int j = 0; j < bit4.Length; j++)
                {
                    int matNum = Convert.ToInt32(bit4[j]);
                    volElements[count].matnr = matNum;
                    count++;

                    if (matNum > numMaterials)
             numMaterials = matNum;
        } 
   }
    }
    //GC.Collect(); //I know it not recommended to call GC manually //but for this   testing purpose to check if it cleans up string //array.
 }
  • 3
    Я не уверен, что вы можете определенно определить, в каком поколении будет находиться объект ... это зависит от того, когда GC выполнит свою очистку и будет ли объект все еще находиться в области действия в то время.
  • 2
    Цикл ничего не выделяет, поэтому маловероятно, что этот массив выживет после поколения # 0. Не называйте GC.Collect (). И на самом деле никогда не беспокойтесь о GC, пока у вас нет положительного доказательства, что у вас есть проблема.
Теги:
garbage-collection

2 ответа

0
Лучший ответ

Мой вопрос в том, собирается ли GC очистить это в первом поколении или он остался бы и повесился бы как поколение 2.

Обратите внимание на то, что генераторы здесь Gen0 и Gen1, ваши строки никогда не попадут в Gen2.

Оба могут случиться. Когда GC происходит во время этого цикла while, некоторые из строк будут использоваться (достижимы) и будут продвигаться от Gen0 до Gen1. Но с низкой вероятностью и не более чем горсткой.

Так что не о чем беспокоиться.

  • 0
    Если, конечно, строка не достаточно велика, чтобы результирующий массив шел прямо в LOH.
  • 0
    @BrianRasmussen - я думаю, мы можем исключить это.
Показать ещё 2 комментария
0

Поскольку массив довольно короткий, вероятно, почти каждый экземпляр останется в поколении 1.

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

  • 0
    Можете ли вы поделиться какими-либо показателями или эвристиками, чтобы подтвердить утверждение «которое должно быть достаточно редким» или это просто на основе того факта, что экземпляры находятся в области действия в течение такого короткого периода времени, а прогоны GC будут относительно редкими?
  • 0
    @AntP: Да, он основан на коротком времени, и в коде нет ничего, что могло бы вызвать множество коллекций. Экземпляры используются только по одному за раз (помните, что область не имеет значения для сборки мусора), поэтому только один экземпляр можно использовать при сборе, что ограничивает риск.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню