Сборка мусора и локальные переменные
Alex Che, 2009-10-28 22:21
Если вы программируете на C#, то у меня для вас вопрос. Как вы думаете, сколько раз будет выводиться в консоль строка "GC called" при исполнении следующего кода:
using System;
using System.Threading;
class GarbageCollectorTest
{
public static void Main()
{
Timer t = new Timer(CallGC, null, 1000, 1000);
Console.ReadKey();
}
static void CallGC(object o)
{
GC.Collect();
Console.WriteLine("GC called");
}
}
using System.Threading;
class GarbageCollectorTest
{
public static void Main()
{
Timer t = new Timer(CallGC, null, 1000, 1000);
Console.ReadKey();
}
static void CallGC(object o)
{
GC.Collect();
Console.WriteLine("GC called");
}
}
Правильный ответ: зависит от параметров компиляции. В release-сборке строка выведется только один раз. В debug-сборке строка будет выводится до нажатия пользователем клавиши.
В C++ время жизни локальной (автоматической) переменной определяется областью ее видимости - переменная уничтожается в момент выхода потока исполнения из этой области.
В C# время жизни такой переменной определяется областью ее использования. Т.е., переменная может быть уничтожена до окончания области своей видимости, если сборщик мусора посчитает, что переменная больше не используется.
В debug-сборках для удобства отладки время жизни переменной искусственно удлиняется до окончания области видимости.
Что касается Java, то насколько мне известно спецификация JVM тоже допускает подобную реализацию сборщика мусора.
P.S.: Если вы программируете на C# и для вас этот пост оказался откровением, прочтите книгу Джеффри Рихтера "СLR via C#". Там вы сможете найти еще много интересного, а главное - полезного для серьезной разработки для .NET Framework.
В C++ время жизни локальной (автоматической) переменной определяется областью ее видимости - переменная уничтожается в момент выхода потока исполнения из этой области.
В C# время жизни такой переменной определяется областью ее использования. Т.е., переменная может быть уничтожена до окончания области своей видимости, если сборщик мусора посчитает, что переменная больше не используется.
В debug-сборках для удобства отладки время жизни переменной искусственно удлиняется до окончания области видимости.
Что касается Java, то насколько мне известно спецификация JVM тоже допускает подобную реализацию сборщика мусора.
P.S.: Если вы программируете на C# и для вас этот пост оказался откровением, прочтите книгу Джеффри Рихтера "СLR via C#". Там вы сможете найти еще много интересного, а главное - полезного для серьезной разработки для .NET Framework.

Комментарии: 0:
Отправить комментарий
<< Главная страница