Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Очистка памяти


Автор: _prishelec_ 13.8.2010, 15:43
Добрый день!
Интересует такой вопрос: приложение написано на c#, и при его сворачивании (минимизирование окна) сбрасывается оперативная память. К примеру приложение занимало метров 30, после минимизации уже метров 2-4. Как можно это делать программно?

Уже несколько часов юзаю System.Diagnosticsю.Process.GetCurrentProcess(), пока толкового решения не нашел?

Автор: Voyager 13.8.2010, 17:02
Код

        [System.Runtime.InteropServices.DllImport("psapi.dll")]
        static extern int EmptyWorkingSet(IntPtr hwProc);

        static void ClearMemory()
        {
            try
            {
                EmptyWorkingSet(System.Diagnostics.Process.GetCurrentProcess().Handle);
            }
            catch
            {
            }
        }

Автор: gambit 13.8.2010, 19:11
Принудительно вызвать GC. Он освободит все не использованные ресурсы. Хотя MS этого не советуют, GC сам все сделает, когда он будет нужен. Кроме того, зачем? У вас на столько мало памяти, что надо контролировать приложение?

Автор: azesmcar 13.8.2010, 19:37
Цитата(gambit @  13.8.2010,  19:11 Найти цитируемый пост)
Принудительно вызвать GC. 

 smile 
Код

GC.Collect();

если быть точнее.

Цитата(gambit @  13.8.2010,  19:11 Найти цитируемый пост)
У вас на столько мало памяти, что надо контролировать приложение?

тогда CLR сам очистит память..опять же нет нужды вызывать самому smile 

Автор: ДобренькийПапаша 13.8.2010, 19:51
_prishelec_
Трогать сборщик мусора вообще не рекомендуется. Делать этого не надо даже тогда, когда кажется, что надо. GC трогать действительно следует в 1% случаев из тех, когда приходит такая мысль в голову.

Обычно GC затрагивается программно, когда создаются одноразовые объекты (реализующие IDisposable), а по спецификации, такие объекты ещё и финализатор должны определить. Таким образом GC будет затронут программно.

Какие ещё возможны случаи - даже не знаю)))

Автор: _prishelec_ 13.8.2010, 22:31
Цитата(gambit @ 13.8.2010,  19:11)
Принудительно вызвать GC. Он освободит все не использованные ресурсы. Хотя MS этого не советуют, GC сам все сделает, когда он будет нужен. Кроме того, зачем? У вас на столько мало памяти, что надо контролировать приложение?

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

Автор: jonie 13.8.2010, 22:57
Цитата(Voyager @ 13.8.2010,  17:02)
Код

        [System.Runtime.InteropServices.DllImport("psapi.dll")]
        static extern int EmptyWorkingSet(IntPtr hwProc);

        static void ClearMemory()
        {
            try
            {
                EmptyWorkingSet(System.Diagnostics.Process.GetCurrentProcess().Handle);
            }
            catch
            {
            }
        }

зря вы кстати на это не обратили внимание... это просто сбросил ворксет в пейджфайл.. и в эксплороре будет выглядеть как будто памяти мало..  )) 
в общем "меньше" чем можно оно не сможет стать имхо.

Автор: _prishelec_ 13.8.2010, 23:05
Цитата(jonie @ 13.8.2010,  22:57)
Цитата(Voyager @ 13.8.2010,  17:02)
Код

        [System.Runtime.InteropServices.DllImport("psapi.dll")]
        static extern int EmptyWorkingSet(IntPtr hwProc);

        static void ClearMemory()
        {
            try
            {
                EmptyWorkingSet(System.Diagnostics.Process.GetCurrentProcess().Handle);
            }
            catch
            {
            }
        }

зря вы кстати на это не обратили внимание... это просто сбросил ворксет в пейджфайл.. и в эксплороре будет выглядеть как будто памяти мало..  )) 
в общем "меньше" чем можно оно не сможет стать имхо.

Большое вам спасибо. Кста память идет в swap или же нет, если в среднем прога хавает под 50 метров оперативы (это со временем, минут так через 10, если не сбросить), на серваке гига 2, я думаю при вашем методе выгрузки памяти, я копий ну 40 спокой ну запущу, при ежесекундной очистке проаг весит от 2-10 метров

Добавлено @ 23:13
Цитата(jonie @ 13.8.2010,  22:57)
Цитата(Voyager @ 13.8.2010,  17:02)
Код

        [System.Runtime.InteropServices.DllImport("psapi.dll")]
        static extern int EmptyWorkingSet(IntPtr hwProc);

        static void ClearMemory()
        {
            try
            {
                EmptyWorkingSet(System.Diagnostics.Process.GetCurrentProcess().Handle);
            }
            catch
            {
            }
        }

зря вы кстати на это не обратили внимание... это просто сбросил ворксет в пейджфайл.. и в эксплороре будет выглядеть как будто памяти мало..  )) 
в общем "меньше" чем можно оно не сможет стать имхо.

Я этот метод как раз сейчас и заюзал и остался доволен.
Всем спасибо. Репу немогу поднять никому, мало у меня еще постов smile.

Автор: VirusUZ 14.8.2010, 09:16
Код

Dispose(false);
Initsialisation();

Автор: gambit 14.8.2010, 11:58
Цитата(_prishelec_ @  13.8.2010,  22:31 Найти цитируемый пост)
На серваке надо запустить столько копий, сколько хватает оперативы. 

У меня челюсть отвисла. Почитайте про домены.

Автор: _prishelec_ 15.8.2010, 00:04
Цитата(gambit @ 14.8.2010,  11:58)
Цитата(_prishelec_ @  13.8.2010,  22:31 Найти цитируемый пост)
На серваке надо запустить столько копий, сколько хватает оперативы. 

У меня челюсть отвисла. Почитайте про домены.

Это вы что имели ввиду?

Автор: gambit 15.8.2010, 00:28
Что для подобных работ используются потоки. Но во многих случаях, этого мало (например если требуется разделение памяти), возможно и в вашем случае тоже, тогда используют домены приложения.
А запускать на каждую копию отдельный процесс - не кавайно!!!
Подробнее про домены http://msdn.microsoft.com/ru-ru/library/ms173138.aspx

Добавлено через 9 минут
Даже лучше вот отсюда начать http://msdn.microsoft.com/ru-ru/library/2bh4z9hs.aspx

кроме того, у меня в мозгу как то не очень умещаются фразы:

Цитата(_prishelec_ @  13.8.2010,  15:43 Найти цитируемый пост)
и при его сворачивании (минимизирование окна)

Цитата(_prishelec_ @  13.8.2010,  22:31 Найти цитируемый пост)
На серваке надо запустить столько копий, сколько хватает оперативы.


Цитата(_prishelec_ @  13.8.2010,  23:05 Найти цитируемый пост)
я копий ну 40 спокой ну запущу

как вы их сворачивать то будите??? тем более 
Цитата(_prishelec_ @  13.8.2010,  23:05 Найти цитируемый пост)
при ежесекундной очистке


И самое главное, сервер это все таки стойка, а не ящик под ногами, а нормальная стойка попахивает уже не 40 копиями, а чуть побольше.

Автор: _prishelec_ 15.8.2010, 01:03
Ведется разработка проекта для взятия данных из биллинговых систем. У них используются высокотехнологичные фильтры, дабы отследить ботов. С потоками ен получиться, так как мозилловский движок висит в одном адресном пространстве и ипа удаление Куков и тд происходит для всех потоков, также если делать маскировку, типа менять заголовки запроса, тоже лажа – меняешь в одном потоке и меняются в остальных. Мной было перепробовано много вариантов.
В свое время система работала полностью на PHP (просто система из несколько отдельных частей), использовал мной написанный класс для CURL. Кста могу поделиться: http://depositfiles.com/files/lpza7qfe2. Но нужна обработка DOM и т.д. В общем премудростей много, конечная цель: полная эмуляция браузера.

Уже все решено и проект на завершающей стадии:
Сворачивать уже ничего ненадо:
Помог код:

Код

[System.Runtime.InteropServices.DllImport("psapi.dll")]
        static extern int EmptyWorkingSet(IntPtr hwProc);

        static void ClearMemory()
        {
            try
            {
                EmptyWorkingSet(System.Diagnostics.Process.GetCurrentProcess().Handle);
            }
            catch
            {
            }
        }


Кста я погуглил и по статистике множество решений юзают: EmptyWorkingSet.

Однажды каким-то макаром мне посоветовали вот http://gluescript.sourceforge.net/.

Только коллеги сильно не увлекайтесь, а то мозг напрягает до ужаса. Какая-то дребидень.

Автор: gambit 15.8.2010, 01:30
Цитата(_prishelec_ @  15.8.2010,  01:03 Найти цитируемый пост)
 и тд происходит для всех потоков, также если делать маскировку, типа менять заголовки запроса, тоже лажа – меняешь в одном потоке и меняются в остальных. 


Цитата(gambit @  15.8.2010,  00:28 Найти цитируемый пост)
 Но во многих случаях, этого мало (например если требуется разделение памяти), возможно и в вашем случае тоже, тогда используют домены приложения.


Автор: _prishelec_ 15.8.2010, 02:11
Цитата(gambit @ 15.8.2010,  01:30)
Цитата(_prishelec_ @  15.8.2010,  01:03 Найти цитируемый пост)
 и тд происходит для всех потоков, также если делать маскировку, типа менять заголовки запроса, тоже лажа – меняешь в одном потоке и меняются в остальных. 


Цитата(gambit @  15.8.2010,  00:28 Найти цитируемый пост)
 Но во многих случаях, этого мало (например если требуется разделение памяти), возможно и в вашем случае тоже, тогда используют домены приложения.

Да я с доменами не был знаком до вашего поста. Сейчас курю инфу. Пока спасибо за инфу. А дальше видно будет smile Мот с меня еще на пиво получиться в знак благодарности.. У 
Мне самомоу инетресно что получиться. То есть я смогу запускуть несколько копий прог под 1 домен и тд.?

Автор: gambit 15.8.2010, 13:45
Цитата(_prishelec_ @  15.8.2010,  02:11 Найти цитируемый пост)
То есть я смогу запускуть несколько копий прог под 1 домен и тд.?

не совсем. Процедура создания(и уничтожения) процесса в windows очень длительная операция. Что бы избежать постоянного старта процессов, например в веб-сервере(если пользователей сайта пускать под отдельными потоками, то это удар по безопасности, значит каждому нужен процесс, а это любой сервак поставит на колени), были сделаны домены. Очень грубо говоря, домен это экземпляр приложения под управлением процесса винды. Процесс может иметь любое кол-во доменов. Т.е. любой процесс, может содержать любое кол-во запущенных копий приложения. Каждый домен изолирован (в смысле памяти) от другого, так что на безопасность это мало влияет.

Автор: _prishelec_ 15.8.2010, 16:30
Не хочет на доменах вообще пахаать, после создания более чем одной копиии, сразу виснет, это изза мозилловского компонента. Во засада.

Автор: _prishelec_ 15.8.2010, 17:18
Не домены не помогают и глючит сам компонент браузера, присоздании более одной копии, походу в компоненте глюк. Хотя я сегодня читал, что вроде мозилловский движок просто так через домен не запустишь.

Добавлено через 10 минут и 6 секунд
Цитата(gambit @ 15.8.2010,  13:45)
Цитата(_prishelec_ @  15.8.2010,  02:11 Найти цитируемый пост)
То есть я смогу запускуть несколько копий прог под 1 домен и тд.?

не совсем. Процедура создания(и уничтожения) процесса в windows очень длительная операция. Что бы избежать постоянного старта процессов, например в веб-сервере(если пользователей сайта пускать под отдельными потоками, то это удар по безопасности, значит каждому нужен процесс, а это любой сервак поставит на колени), были сделаны домены. Очень грубо говоря, домен это экземпляр приложения под управлением процесса винды. Процесс может иметь любое кол-во доменов. Т.е. любой процесс, может содержать любое кол-во запущенных копий приложения. Каждый домен изолирован (в смысле памяти) от другого, так что на безопасность это мало влияет.

У вас мозилла установлена? Если да то дайте  путь к файлу. Я мог бы отправть прогу, чтоб вы глянули, мот у вас получиться ее запускать через домены, если конечно можно.

Автор: gambit 15.8.2010, 17:41
нет, мозилы нету((

Автор: _prishelec_ 15.8.2010, 18:28
Вот код создания:
Код

            try
            {
                AppDomain secondDomain = AppDomain.CreateDomain("New AppDomain");
                secondDomain.ExecuteAssembly("test.exe");
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message);
            }


Ведь все верно так?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)