У меня есть очень простой вопрос.
Я пишу цикл как это:
while(true)
{
MyTestClass myObject = new MyTestClass();
}
myObject = null;
в конце каждого повторения? myObject
- это переменная - которая имеет фиксированную позицию в стеке для ссылки; однако каждый new MyTestClass ()
представляет собой отдельный объект , созданный где-то в доступном пространстве кучи; каждый раз разный , а
- но это будет отображаться только после выхода из цикла. И поскольку на каждой итерации вы сразу выделяете его, здесь нет ощутимой разницы Когда объект будет создан в цикле, собран мусор?
В какой-то момент после последнего упоминание о нем удаляется. Новая ссылка создается и удаляется на каждой итерации цикла, поэтому сборщик мусора может собирать эти объекты, когда захочет. На практике это скорее всего произойдет, когда ваша программа полностью заполнит нулевое поколение.
Кроме того, для каждой итерации выделяется ли новое место в памяти для ссылки на myObject?
Да.
Что, если я напишу
myObject = null;
в конце каждой итерации?
Это не будет иметь никакого значения. Установка myObject = null;
удаляет эту ссылку на объект, но она все равно удаляется, когда переменная myObject
переназначается в следующей итерации цикла.
Добавим немного кода, который действительно использует объект, чтобы было понятнее, что на самом деле происходит:
while(true) {
// Here a new instance is created in each iteration:
MyTestClass myObject = new MyTestClass();
// Here the instance is still in use
// until here:
myObject.CallSomething();
// Here the instance isn't used any more,
// so the GC can collect it if it wants to.
// Setting the reference to null here:
myObject = null;
// is useless, as the GC already knows that the
// instance is unused before that time.
}
Давайте проясним несколько вещей. Каждый раз, когда вы попадаете внутрь цикла, myObject
будет назначен новому адресу. Таким образом, весь этот цикл когда-либо выделяет новые адреса памяти для одного имени переменной. Таким образом:
В качестве дополнения к остальным ответам:
Вы можете сделать свой класс структурой. Тогда он будет находиться в стеке и выбрасываться на каждой итерации. Если ваша структура создаст новые классы, то вы вернетесь к началу. И если ваша структура большая, это может отрицательно сказаться на производительности, но в противном случае, если она маленькая, это может положительно сказаться на производительности.