Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Garbage Collector, запуск по требованию программы 
V
    Опции темы
Azzdorf
  Дата 11.7.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



Тут вопросик общего плана. Программа создает Кучу и Стек.
Куча умерает ли вместе с программой????
А GAC чистит только стек????

И каким методом можна автоматически запускать Garbige Collector в нужный момент времени...
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
QryStaL
Дата 11.7.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Код

GC.Collect()



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
ivashkanet
Дата 11.7.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Azzdorf @  11.7.2007,  14:31 Найти цитируемый пост)
Куча умерает ли вместе с программой????

Конечно. Об этом заботиться среда .Net 
Цитата(Azzdorf @  11.7.2007,  14:31 Найти цитируемый пост)
А GAC чистит только стек????

Нет, только кучу
Стек вообще никто не чистит специально. Он так устроен, что чиститься автоматически и задумываться об его очистке не надо


Это сообщение отредактировал(а) ivashkanet - 11.7.2007, 17:09
PM MAIL WWW ICQ   Вверх
Azzdorf
  Дата 11.7.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



Цитата(ivashkanet @ 11.7.2007,  17:08)
Нет, только кучу
Стек вообще никто не чистит специально. Он так устроен, что чиститься автоматически и задумываться об его очистке не надо

А что там чистить в Куче и Что GAC чистит в стеке????
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
mr.DUDA
Дата 11.7.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Стек - вообще интересное понятие. Вот кто например может мне сказать, почему массивы хранятся вне памяти метода (т.е. в куче), однако элементы массива являются value type? Это что, означает что есть некая память называемая стековой, но таковой не являющаяся?

 smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Azzdorf
  Дата 11.7.2007, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



Цитата(mr.DUDA @ 11.7.2007,  20:48)
Стек - вообще интересное понятие. Вот кто например может мне сказать, почему массивы хранятся вне памяти метода (т.е. в куче), однако элементы массива являются value type? Это что, означает что есть некая память называемая стековой, но таковой не являющаяся?

 smile

 smile  и как тогда мона в этом разобратся?????
 smile  как минимум нужен отдельный форум по GAC.... smile

Добавлено через 1 минуту и 5 секунд
Цитата(QryStaL @ 11.7.2007,  16:19)
Код

GC.Collect()

он сам пройдется, освободит файл и вырубиться7??? smile 
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
tol05
Дата 11.7.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(mr.DUDA @  11.7.2007,  20:48 Найти цитируемый пост)
почему массивы хранятся вне памяти метода (т.е. в куче), однако элементы массива являются value type

Я могу smile
По той же причине в куче хранятся, по которой и класс типа
Код

class A
{
   int x;
   int y;
}

массивы, это те же классы, содержащие свойства, методы и поля...

Цитата(mr.DUDA @  11.7.2007,  20:48 Найти цитируемый пост)
есть некая память называемая стековой, но таковой не являющаяся

да нет. есть просто стековая память и куча. В стековой памяти хранятся value-объекты и ссылки на reference-объекты. Когда выходим из метода стек чистится полностью, т.е. ячейки с value-объектами очищаются и ячейки со ссылками на reference-объекты очищаются тоже. В итоге мы имеем reference-объекты, на которые никто не указывает (недостижимые объекты, добыча GC)
В случае с массивом, ссылка на него изчезнет, а массив - останется в куче до сборки мусора...

Azzdorf могу посоветовать почитать этот топик, может что-то прояснится по GC

И не путай GC с GAC - это разные вещи  smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
mr.DUDA
Дата 11.7.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(tol05 @  11.7.2007,  21:23 Найти цитируемый пост)
 Когда выходим из метода стек чистится полностью, т.е. ячейки с value-объектами очищаются и ячейки со ссылками на reference-объекты очищаются тоже. В итоге мы имеем reference-объекты, на которые никто не указывает (недостижимые объекты, добыча GC)


Цитата(tol05 @  11.7.2007,  21:23 Найти цитируемый пост)
В случае с массивом, ссылка на него изчезнет, а массив - останется в куче до сборки мусора...

Противоречие: стек чистится = вся память занятая под стек очищается = все объекты выделенные на стековой памяти удаляются
Вопрос 1: куда при этом деваются объекты (структуры, инты и т.п.) хранимые в массиве? Они ведь value type а не reference type, и в отличие от массива должны быть выделены на стеке. Почему же они остаются жить после очистки стековой памяти?
Вопрос 2: как GC рассматривает объекты, созданные на стеке но хранимые в массиве? Как часть reference-типа? То есть попадают ли они в поколения, собираемые GC?  

З.Ы. Судя по тому что я видел в .NET Memory Profiler, даже простейшие int-ы собираются GC вплоть до 1-2 поколений сборки мусора. Но это объяснимо в случае если они боксятся. В случае же массивов, как и generic-ов заявляемые мелкософтом возможности гарантируют что простейшие типы не будут бокситься, если они лежат в массиве или одной из generic-коллекций (кстати, все generic-коллекции так или иначе юзают массивы). Что же тогда на самом деле происходит с элементами массива, под какую категорию они подпадают? Ау, Рихтер, где ты?  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Void
Дата 11.7.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Цитата(mr.DUDA @  11.7.2007,  23:32 Найти цитируемый пост)
Вопрос 2: как GC рассматривает объекты, созданные на стеке но хранимые в массиве?

Это как?



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.DUDA
Дата 11.7.2007, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Void @ 11.7.2007,  22:03)
Цитата(mr.DUDA @  11.7.2007,  23:32 Найти цитируемый пост)
Вопрос 2: как GC рассматривает объекты, созданные на стеке но хранимые в массиве?

Это как?

Это так:
Код
int[] array = new int[10];


Что есть элемент массива array? Это value type (и тогда он физически расположен на стеке) или reference type (лежит в куче) ?


--------------------
user posted image
PM MAIL WWW   Вверх
Azzdorf
  Дата 11.7.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



Насколько ефективно использовать GC???? Я знаю что в некоторых языках нужно было самому выделять стеки и после выполнения разных действий удалять их - не есть ли этот способ - лучшим в организации выделения памяти под работу компютера - если д, то на...GC???? smile  smile  smile 
Или он придумал для сокращения процеса разработки програмного обеспичения???
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
tol05
Дата 11.7.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(mr.DUDA @  11.7.2007,  21:32 Найти цитируемый пост)
Противоречие: стек чистится = вся память занятая под стек очищается = все объекты выделенные на стековой памяти удаляются

нет противоречия если мы в ф-ции создаем массив целых чисел
Код

int[] arrInt = new int[10]  //кстати, оператор new - это ведь вызов dynamicalloc ? :)
то в стеке создается переменная 32 бита для хранения значени переменной arrInt. А значением этой переменной будет адрес блока памяти, выделенного под массив (под десять целых чисел + системмные блоки класса)
После выхода из ф-ции переменная arrInt сотрется, а блок памяти для массива в куче - останется.

Ответ 1  
Цитата(mr.DUDA @  11.7.2007,  21:32 Найти цитируемый пост)
 куда при этом деваются объекты (структуры, инты и т.п.) хранимые в массиве?

smile эти объекты размещаются в куче изначально, в ней и хранятся, уничтожаются сборщиком мусора. Поэтому "они остаются жить после очистки стековой памяти". Все то же самое, как в случае с массивом arrInt... Еще раз повторю:в стеке хранится (и после выхода из ф-ции удаляется) только ссылка на массив! 
Если структура, инт и что угодно из value-объектов создаются сами по себе, то они размещаются и хранятся в стеке, благо посчитать требуемый ими объем памяти - несложно. Если они - члены ссылочного типа, то размещаться они будут в куче, в блоке памяти, выделенном под ссылочный объект. Если у структуры есть поле ссылочного типа, то в стеке будет размещена вся структура (под член ссылочного типа будет выделено 4 байта, для хранения ссылки на кучу). Когда стек будет очищаться - в куче останется недостижимый объект (бывший член структуры)

Ответ 2 
Цитата(mr.DUDA @  11.7.2007,  21:32 Найти цитируемый пост)
 как GC рассматривает объекты, созданные на стеке но хранимые в массиве
 честно говоря не понял, что ты имеешь в виду... 
Цитата(mr.DUDA @  11.7.2007,  21:32 Найти цитируемый пост)
попадают ли они в поколения, собираемые GC?
 в поколения может попасть все, что подвластно сборщику мусора, т.е. все, что хранится в куче. А попадет реально, или нет - это уже у GC спрашивать нужно. smile Но если тип поддерживает финализатор - 100% попадет.

Ответ 3 (на "З.Ы.")
Мне кажется, что ты зря связываешь понятия поколения с боксингом, + еще куча со стеком... smile
Главное - это к какому типу ссылочного объекта принадлежат простейшие. Ну и от системмных условий. От этого зависит как часто и насколько тщательно будет сборщик мусора собирать мусор. А боксинг используется только при приведении типов. Конечно, и массивы и генерики - типизированы, поэтому они не нуждаются в боксинге.
Но это не важно для нашего вопроса: незабоксенные инты (члены массива) будут находится в куче также, как забоксенные, как вообще все элементы ссылочных типов.... И когда GC рещит "грохнуть" объект в куче, он "грохнет" его вместе со всеми его членами, даже если там 10 незабоксенных и 5 забоксенных.

Azzdorf вопрос непосредственного использования GC - зависит от ситуации. Но "по статистике"  smile применяется очень редко... Гораздо реже IDisposable. Вот это действительно, на что нужно обратить внимание в первую очередь...

Динамическое выделение стековой памяти, стековые массивы - это оптимизация производительности прежде всего. Тоже - непростая и спорная тема... smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Void
Дата 11.7.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Кто и когда говорил, что экземпляры value types всегда хранятся в стеке?
Цитата(Рихтер @  CLR via C#)
Экземпляры этих [значимых] типов обычно размещаются в стеке потока (хотя они могут быть встроены и в объект ссылочного типа).

В случае с массивом имеет место как раз второй вариант.

mr.DUDA, уж не завладел ли кто твоим аккаунтом, если ты такие вещи спрашиваешь? smile

Цитата(Azzdorf @  12.7.2007,  00:14 Найти цитируемый пост)
Я знаю что в некоторых языках нужно было самому выделять стеки и после выполнения разных действий удалять их - не есть ли этот способ - лучшим в организации выделения памяти под работу компютера - если д, то на...GC????

С пулами объектов есть серьёзные проблемы. С region inference тоже.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.DUDA
Дата 11.7.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Void @  11.7.2007,  22:28 Найти цитируемый пост)
В случае с массивом имеет место как раз второй вариант

.mr.DUDA, уж не завладел ли кто твоим аккаунтом, если ты такие вещи спрашиваешь?

Да нет. Просто начав оптимизировать одну софтину, активно создающую тонны мелких объектов, пришёл к тому что можно объявить их структурами и хранить в пуле (а-ля массив с запасом), и тут посетила мысль: а как к этому массиву отнесётся GC? После чего экстраполировал мысль на все остальные случаи. Просто непонятно, что это за тип такой "массив", что сам он является ссылочным типом - не копируется при присвоении, собирается при уборке -- но элементы массива не являются ссылочными типами.

Это, имхо, либо ломает общую организацию работы с памятью в .NET, либо вводит исключение из правила.


--------------------
user posted image
PM MAIL WWW   Вверх
Azzdorf
  Дата 11.7.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



Цитата

tol05Динамическое выделение стековой памяти, стековые массивы - это оптимизация производительности прежде всего. Тоже - непростая и спорная тема...



согласен что спорная, но не есть ли оптимальная робота программы с памятю - одним из столпов професионального программирования и создания ефективных преложений????  и стоит ли к этому стремится или это пустая трата времени???
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0601 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.