Аннотация:
Алгоритм работы сборщика мусора (garbage collector, далее просто GC), являющегося частью CLR, подробно описан в книге Джефри Рихтера (Jeffrey Richter) «Applied Microsoft .NET Framework Programming». Мы не будем приводить здесь столь же подробное описание этого алгоритма, но обязательно остановимся на некоторых ключевых моментах.
Если нам не помогут, то мы тоже никого не пощадим.
[quote]Для хранения объектов CLR использует хип, подобный хипу C++, за тем важным исключением, что хип CLR не фрагментирован[/quote]
Явно противоречит
[quote] Другими словами, объекты, пережившие две сборки мусора, остаются в хипе навсегда и GC не занимается их дефрагментацией.[/quote]
Так фрагментирована всё-таки куча или нет?
А как стыкуется вот эта фраза:
"объекты, пережившие две сборки мусора, остаются в хипе навсегда и GC не занимается их дефрагментацией"
и фраза из статьи ms-help://MS.MSDNQTR.2002OCT.1033/cpguide/html/cpconautomaticmemorymanagement.htm
"If this does not reclaim enough memory, the garbage collector can perform a collection of generations 2, 1, and 0."
Т.е объект поколения 2 все же может подметен из хипа?
Никакого противоречия тут нет.
Первая фраза означает, что после сборки куча дефрагментируется и все объекты сдвигаются к началу.
Вторая, что только то, что GC просто игнорирует объекты из второго поколения.
Здравствуйте, CooLer, Вы писали:
CL>Первая фраза означает, что после сборки куча дефрагментируется и все объекты сдвигаются к началу. CL>Вторая, что только то, что GC просто игнорирует объекты из второго поколения.
Да, но всё же GC.Collect() чистит и второе поколение. Данная фраза относится к автоматическому режиму GC, когда в её работу не вмешиваются.
... << RSDN@Home 1.1 beta 1 >>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Тестовый юзер, Вы писали:
ТЮ>Т.е объект поколения 2 все же может подметен из хипа?
Вполне возможно. Судя по тестам, GC не спешит чистить второе поколение, но вполне возможны ситуации, когда это может произойти. Ни подтвердить, ни опровергнуть это нельзя, т.к. во-первых, доступные исходники Rotor'а, особенно по части GC, весьма отличаются от того что на самом деле происходит в CLR, а во-вторых, MS постоянно совершенствует CLR и возможно в версии 1.1 фреймворка что-то уже и изменилось.
... << RSDN@Home 1.1 beta 1 >>
Если нам не помогут, то мы тоже никого не пощадим.
ИТ>Авторы: ИТ> Игорь Ткачев
ИТ>Аннотация: ИТ>Алгоритм работы сборщика мусора (garbage collector, далее просто GC), являющегося частью CLR, подробно описан в книге Джефри Рихтера (Jeffrey Richter) «Applied Microsoft .NET Framework Programming». Мы не будем приводить здесь столь же подробное описание этого алгоритма, но обязательно остановимся на некоторых ключевых моментах.
class Class1
{
class TestClass
{
public override string ToString()
{
return"Test Object No " + objectNo;
}
public TestClass()
{
objectNo++;
}
static int objectNo = 0;
}
// «слабая» ссылка
WeakReference wr = new WeakReference(null);
// Возвращает ссылку на объект,
// при необходимости создаёт новый
TestClass GetRef()
{
// Если объект уже создан и всё ещё жив,
// то мы можем получить ссылку на него через Target
TestClass tc = (TestClass)wr.Target;
if (tc == null)
{
tc = new TestClass();
wr.Target = tc;
}
return tc;
}
public void Test()
{
// Получаем ссылку на объектobject obj = GetRef();
// Вызываем сборщик мусора,
// но объект не будет удалён,
// т.к. существует «сильная» ссылка obj
GC.Collect();
// Печатаем "Test Object No 1"
Console.WriteLine(GetRef());
// удаляем «сильную» ссылку
obj = null;
// Печатаем опять "Test Object No 1",
// т.к. сборщик мусора не вызывался и мы можем
// получить объект через «слабую» ссылку
Console.WriteLine(GetRef());
// Вызываем сборщик мусора ещё раз
GC.Collect();
// На этот раз печатаем "Test Object No 2",
// сборщик мусора удалил старый объект,
// и вызоа GetRef создаст новый
Console.WriteLine(GetRef());
}
}
Объясните глупому, как при вызове Console.WriteLine(GetRef()); будет вызываться
public override string ToString()
? Или что вообще будет вызываться? Другими словами: точно ли печататься вообще что-либо будет?
Здравствуйте, ynblpb, Вы писали:
Y>Объясните глупому, как при вызове Console.WriteLine(GetRef()); будет вызываться Y>
Y>public override string ToString()
Y>
Y>? Или что вообще будет вызываться? Другими словами: точно ли печататься вообще что-либо будет?
А в чём проблема? Берёт и вызывает. ToString — это метод object, а всё объекты в .NET происходят от object.
Вот что происходит в результате (TextWriter.cs из исходников Ротора):
public virtual void Write(Object value) {
if (value != null) {
IFormattable f = value as IFormattable;
if (f != null)
Write(f.ToString(null, FormatProvider));
else
Write(value.ToString());
}
}
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, ynblpb, Вы писали:
Y>Объясните глупому, как при вызове Console.WriteLine(GetRef()); будет вызываться Y>
Y>public override string ToString()
Y>
Y>? Или что вообще будет вызываться? Другими словами: точно ли печататься вообще что-либо будет?
RTFM Console.WriteLine(ojbect value):
Remarks
If value is a null reference (Nothing in Visual Basic), only the line terminator is written. Otherwise, the ToString method of value is called to produce its string representation, and the resulting string is written to the standard output stream.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Соответственно, если вы создаёте класс, использующий какие-либо ресурсы,
вы также должны реализовать этот интерфейс и метод Dispose в соответствии со следующими требованиями
(эти правила никак не обозначены в MSDN и взяты мной из комментариев к исходным текстам CLI):
— Подавлять вызов метода Finalize путём удаления ссылки на объект из Finalization Queue.
не совсем понятно, почему (для чего)
вызывая Dispose, мы уже сказали сами себе, что объект нам более не нужен. а значит и использовать его более не собираемся.
В реалицации метода Dispose очищать unmanaged ресурсы,
а среда, и garbage collector (при наличии деструктора в очереди) уже позаботятся об очищении своих корней
почему нет ?
Только на РСДН помимо ответа на вопрос, можно получить еще список орфографических ошибок и узнать что-то новое из грамматики английского языка (c) http://www.rsdn.ru/forum/cpp/4720035.1.aspx
Здравствуйте, Serjio, Вы писали:
S>не совсем понятно, почему (для чего)
S>вызывая Dispose, мы уже сказали сами себе, что объект нам более не нужен. а значит и использовать его более не собираемся. S>В реалицации метода Dispose очищать unmanaged ресурсы, S>а среда, и garbage collector (при наличии деструктора в очереди) уже позаботятся об очищении своих корней S>почему нет ?
Finalization Queue и Dispose — это два параллельных механизма. Если отработал один, то другой уже не имеет смысла. Оставление объекта в FQ приводит к тому, что он гарантированно проталкивается в следующее поколение, а следовательно в старших поколениях накапливается больше мусора, который реже чистится.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
ИТ>Авторы: ИТ> Игорь Ткачев
ИТ>Аннотация: ИТ>Алгоритм работы сборщика мусора (garbage collector, далее просто GC), являющегося частью CLR, подробно описан в книге Джефри Рихтера (Jeffrey Richter) «Applied Microsoft .NET Framework Programming». Мы не будем приводить здесь столь же подробное описание этого алгоритма, но обязательно остановимся на некоторых ключевых моментах.