2014-01-22 3 views
0

Я думаю, что у меня есть общее представление о том, как работает сборщик мусора в .Net, но в последнее время мне задали вопрос, который я действительно не понял. Из того, что я помню, вопрос был задан вдоль линий -Сбор мусора .Net

Принимая во внимание различные поколения, участвующих в Garbage Collection, какое поколение вы хотели бы ваши объекты, чтобы быть в?

Я принял предположение и сказал поколение 0, потому что это будет означать короткоживущий объект и освободит память. С другой стороны, когда я просматривал какую-либо документацию MSDN, это указывало на то, что объекты Generation 2 более стабильны (т. Е. Долгоживущие), и я знаю, что GC собирает это реже.

Каков правильный ответ на этот вопрос или это еще один ответ «Это зависит»?

+5

«какое поколение вам бы хотелось, чтобы ваши объекты были в». На самом деле я даже не могу представить причину, по которой мне было бы интересно, в каком gen мои объекты ... –

+0

Я думаю (вообще говоря), если этот вопрос имеет значение для вас, вы делаете что-то неправильно. – Magus

+1

Я бы сказал, что сами поколения не важны, а пропорция между их использованием. Если я буду отслеживать использование GC, я начну с того, чтобы увидеть, как выглядят эти пропорции. –

ответ

5

Правильный ответ - это, конечно, «правая поколение». Если объект недолговечен, я бы хотел, чтобы он находился в генерации, оптимизированной для короткоживущих объектов. Если мой объект долговечен, я бы хотел, чтобы он был в генерации, оптимизированной для долгоживущих объектов.

Если бы для всех объектов было одно «лучшее» поколение, мы сделали бы это по умолчанию и покончим с остальными. Создатели GC будут рады услышать, что генерация является источником значительной сложности в их алгоритмах ;-)

+0

Я вообще не думаю, что долгоживущие объекты имеют значение, они будут перенесены во 2-е поколение после двух коллекций. Я думаю, что цель этого вопроса состояла в том, что хорошо, если недолговечные объекты не доходят до более высоких поколений. – Grzenio

+1

Чтобы быть справедливым, создатели GC добавили эту сложность. :) GC не * имеет * быть поколением и не начинал так. – cHao

+0

@cHao Доказательства до сих пор предполагают, что они * делают * должны быть поколенными ... * если * они хотят лучше работать ;-) – delnan

1

Это немного странный вопрос. Я бы тоже ответил на поколение 0, потому что коллекции поколения 0 намного дешевле, поэтому накладные расходы GC являются самыми маленькими. Я думаю, что цель этого вопроса состояла в том, что хорошо, если недолговечные объекты не доходят до более высоких поколений. Долгоживущие все равно сделают это до последнего поколения.

+1

Они самые дешевые, потому что у большинства объектов нет. Если вы вынуждаете все свои объекты туда, вы теряете все преимущества и получаете некоторые новые недостатки на этом пути. – delnan

+0

@delnan, я не думаю, что речь идет о «форсировании» чего-либо, это больше о наблюдении того, какой объект находится на основе существующих алгоритмов в GC. – Grzenio

+0

Возможно, «сила» - неправильный термин.Я хочу сказать, что вы не хотите, чтобы все объекты находились в gen0: вам нужно только очень короткоживущие в gen0, и каждый объект, который живет дольше, должен выйти из питомника. – delnan

Смежные вопросы