Освобождение памяти
От: 3pac  
Дата: 25.12.06 11:51
Оценка:
В программе постоянно выделяются большие byte[] (несколько десятков мегабайт). В итоге быстро память съедается, а сборщик срабатывает когда метров 20 остаётся. Как освободить явно занятую память? в С++ был delete, а в C#?
Re: Освобождение памяти
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.12.06 11:59
Оценка:
Здравствуйте, 3pac, Вы писали:

3>В программе постоянно выделяются большие byte[] (несколько десятков мегабайт).

Не очень хорошая практика. А точно нужно постоянно выделять эти большие byte[]?
3>В итоге быстро память съедается, а сборщик срабатывает когда метров 20 остаётся. Как освободить явно занятую память? в С++ был delete, а в C#?
Зачем тебе это? Сборщик сам решает, когда ему пособирать память. Ее что, кому-то не хватает?
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Освобождение памяти
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 25.12.06 12:26
Оценка:
Здравствуйте, 3pac, Вы писали:

3>В программе постоянно выделяются большие byte[] (несколько десятков мегабайт). В итоге быстро память съедается, а сборщик срабатывает когда метров 20 остаётся. Как освободить явно занятую память? в С++ был delete, а в C#?


Можно явно заставить сборщик почистить память через GC.Collect.

Объекты, размер которых больше 85000 байт выделяются в специальной области — large object heap. Эта область является частью 2-о поколения. Поэтому такие объекты должны быть долго живущими иначе частая сборка во втором поколении приведет к деградации производительности.

1. Можно сделать пул больших объектов.
2. Можно воспользоваться MemoryFailPoint

Check for sufficient memory resources prior to execution.

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Освобождение памяти
От: 3pac  
Дата: 25.12.06 12:31
Оценка:
Здравствуйте, Sinclair, Вы писали:




S>Не очень хорошая практика. А точно нужно постоянно выделять эти большие byte[]?

да, мне надо гонять содержимое файлов.

S>Зачем тебе это? Сборщик сам решает, когда ему пособирать память. Ее что, кому-то не хватает?

а если стороннему процессу нужна память, а её занимает .net, произойдет очистка? просто она действительно долго держится занятой.
Re: Освобождение памяти
От: TK Лес кывт.рф
Дата: 25.12.06 12:34
Оценка: +2
Здравствуйте, 3pac, Вы писали:

3>В программе постоянно выделяются большие byte[] (несколько десятков мегабайт). В итоге быстро память съедается, а сборщик срабатывает когда метров 20 остаётся. Как освободить явно занятую память? в С++ был delete, а в C#?


Если требуется постоянно выделять память то, почему не сделать пул выделенных блоков? Например, remoting для своих нужд именно так и делает.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Освобождение памяти
От: 3pac  
Дата: 25.12.06 12:42
Оценка:
Здравствуйте, TK, Вы писали:

TK>Если требуется постоянно выделять память то, почему не сделать пул выделенных блоков? Например, remoting для своих нужд именно так и делает.


эээ... наверное так и нужно сделать, но я ещё не настолько advanced... не могли бы пожалуйста чуть поподробнее?
Re[3]: Освобождение памяти
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.12.06 12:57
Оценка: 1 (1)
Здравствуйте, 3pac, Вы писали:

S>>Не очень хорошая практика. А точно нужно постоянно выделять эти большие byte[]?

3>да, мне надо гонять содержимое файлов.
Непонятно, зачем большие byte[] для "гоняния содержимого файлов". Куда гоняешь-то? Есть подозрение, что ты неправильно гоняешь.

3>а если стороннему процессу нужна память, а её занимает .net, произойдет очистка? просто она действительно долго держится занятой.

Очистка происходит тогда, когда память нужна. Пока она не нужна, очистки не происходит. Тем не менее, это не повод занимать O(N) памяти там, где достаточно O(1).
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Освобождение памяти
От: TK Лес кывт.рф
Дата: 27.12.06 06:27
Оценка:
Hello, "3pac"
>
> TK>Если требуется постоянно выделять память то, почему не сделать пул выделенных блоков? Например, remoting для своих нужд именно так и делает.
>
> эээ... наверное так и нужно сделать, но я ещё не настолько advanced... не могли бы пожалуйста чуть поподробнее?

Надо один раз создать массив byte[] достаточного размера и держать его в специальном пуле. Плотребители же должны спрашивать у пула этот массив и по использовании туда его возвращать (т.е. пул будет предоставлять аналоги new и delete из C++).
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Освобождение памяти
От: Morpheus_  
Дата: 29.12.06 12:27
Оценка: -2
Здравствуйте, 3pac, Вы писали:

3>В программе постоянно выделяются большие byte[] (несколько десятков мегабайт). В итоге быстро память съедается, а сборщик срабатывает когда метров 20 остаётся. Как освободить явно занятую память? в С++ был delete, а в C#?


избавиться от ссылки на массив, затем вызвать сборку мусора, например:

    byte[] array = new byte[65535];
//...
    array = null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Освобождение памяти
От: Ranger_XL  
Дата: 13.01.07 09:50
Оценка:
Здравствуйте, TK, Вы писали:

TK>Надо один раз создать массив byte[] достаточного размера и держать его в специальном пуле. Плотребители же должны спрашивать у пула этот массив и по использовании туда его возвращать (т.е. пул будет предоставлять аналоги new и delete из C++).


Есть еще вариант (возможно, он проще, если вся программа состоит из небольшого количества классов и в каждый момент времени требуется только один такой массив): создать public static динамический массив и пользоваться только им.

Или это намного хуже?
Re[5]: Освобождение памяти
От: TK Лес кывт.рф
Дата: 13.01.07 11:55
Оценка:
Hello, "Ranger_XL"
>
> TK>Надо один раз создать массив byte[] достаточного размера и держать его в специальном пуле. Плотребители же должны спрашивать у пула этот массив и по использовании туда его возвращать (т.е. пул будет предоставлять аналоги new и delete из C++).
>
> Есть еще вариант (возможно, он проще, если вся программа состоит из небольшого количества классов и в каждый момент времени требуется только один такой массив): создать public static динамический массив и пользоваться только им.
>
> Или это намного хуже?

А кто будет грантировать то, что этот массив будет использоваться только одиним потребителем? Пул в данном плане обеспечивает некоторую формальность в работе.
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Освобождение памяти
От: Аноним  
Дата: 25.12.06 11:58
Оценка:
3pac:

В программе постоянно выделяются большие byte[] (несколько десятков мегабайт). В итоге быстро память съедается, а сборщик срабатывает когда метров 20 остаётся. Как освободить явно занятую память? в С++ был delete, а в C#?
Может помочь GC.Collect(), хотя вопрос надо исследовать на месте.
Все должно быть просто, очень просто, настолько просто — насколько это возможно!
Мой блог Возможно на твой вопрос уже есть ответ? FAQ


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Освобождение памяти
От: Аноним  
Дата: 26.12.06 00:44
Оценка:
3pac:

В программе постоянно выделяются большие byte[] (несколько десятков мегабайт). В итоге быстро память съедается, а сборщик срабатывает когда метров 20 остаётся. Как освободить явно занятую память? в С++ был delete, а в C#?
Если ты файлы обрабатываешь по очереди, тогда держи один массив для всех файлов, если размер массива меньше очередного файла, создавай новый массив нужного размера.
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>, 4, 5}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Освобождение памяти
От: Аноним  
Дата: 15.01.07 09:30
Оценка: +1
Н-да... Столько сложностей для тривиальной операции...

Не знаю, не первый год пишу на C#, но у меня все время какое-то подспудное чувство дискомфорта... Нам не отказывают в праве проектировать сложные приложения и в способности связанно мыслить, отслеживая порой мельчайшие детали в сложных приложениях, но нам отказывают в способности правильно оценить необходимость очистки памяти...

Ведь нередки ситуации, когда точно знаешь: эту память можно и нужно осовбодить сейчас, а не когда GC соизволит... Так ведь нет...

А по поводу "память очищается тогда, когда она необходима" могу сказать вот что: программы, которые экономно относятся к ресурсам, вызывают уважение и приятное чувство качественности. К некоторым программкам люди просто прикипают душой и не мыслят своей компьютерной жизни без этих маленьких помошников. Однако как только программка с увеличением версии перестаёт быть маленькой, юркой и нежоркой до ресурсов, она уже перестаёт быть тем "другом", она превращается в маленького монстра...

Да и критерий "пока память не понадобится" очень сомнительный. Страницы выгружаются в своп, когда ими долго не пользуются. А представьте себе, что вы в фоне держите какую-нибудь программу. Нередко дизайнеры в фоне держат фотошоп... Хотя это отвлечение. И вот в какой-то момент понадобилась та самая "фоновая" программа, в которой уже набросан немаленький документ... А все страницы уже в свопе... И "маленькая программка с умным GC" уже выжрала все остатки физической памяти... То-то много радости видеть, как поочереди после нее прорисовываются кнопочки в каком-нибудь ворде...

Не знаю, кому как, но мне кажется, что увещевания типа "GC умный, не надо тута копаться, ты просто не так делаешь. Если уж так хочешь, то надо набросать всего-то пару тысяч строк дополнительного кода и всего лишь целиком переделать свой проект" смахивают на самолечение. Не выход это! Даёшь delete в C#!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.