Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Не много ли оперативки хавает NET Добавлено: 07.03.06 21:10  

Автор вопроса:  AVD
Недавно написал одну простенькую прогу и...
Засты в ступоре когда открыл диспечер задачь. Моя простенькая программа занимала 20 МБ оперативки. Потом ради прикола создал бустой проект и посмотрел сколько он занимает места в памяти. Я был просто в шоке - почти 10 метров.
Кто-нибудь подскажите что это за ерунда и как её можно побороть. Или надо перескакивать на С#.

Ответить

  Ответы Всего ответов: 18  

Номер ответа: 1
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #1 Добавлено: 07.03.06 23:11
Недавно написал одну простенькую прогу и...

Моя простенькая программа занимала 20 МБ оперативки

Хорошая программка, чё ж тут ещё скажешь!
ты хотя бы рассказал всем, что же делает эта твоя простенькая программка..
ЗЫ. А .NET сдесь не при чём! Скорее всего вина прокладки между монитором и крЕслом. ;)

Ответить

Номер ответа: 2
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #2 Добавлено: 08.03.06 00:20
C# будет так же.
Синтаксис другой - порочная философия та же :)

Ответить

Номер ответа: 3
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #3
Добавлено: 08.03.06 00:59
А что ты хотел хагрузив ран-тайм в память :)) Хочешь малого размера выдляемой памяти, используй masm или жругой ассемблер ;)

Ответить

Номер ответа: 4
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #4
Добавлено: 08.03.06 03:53
Да здесь проблема не в том.

masm, tasm (мое любимое:))), С, С++...
Проблема (или преимущество- для кого как) в сборщике мусора. Мы не можем сами освобождать ненужные ресурсы и будем ждать пока он это сделает сам.

А пустой проект, как сказал sne, грузит ран-тайм в память.

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

AVD
Посему не переживай, это нормально, по мнению некоторых это прогресс... Возможно что и так....
Возможно ты использовал ресурсы, а сорщик мусора пока не счел нужным освободить память.
Обещано, что в конце концов он это сдеает, но сделает он это когда захочет:))
Поэтому побороть нельзя. Но не забывай, в замен ты избавлен от кучи проблем.

Ответить

Номер ответа: 5
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #5
Добавлено: 08.03.06 10:44
AVD

Хотя кое- что можно сделать.

Чтобы ускорить освобождение ресурсов вызывай принудительно сборщик мусора.
GC.Collect();

Или переопредели виртуальный метод Finalize, который есть у каждого объекта(он уничтожит объект в памяти).

Ответить

Номер ответа: 6
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #6
Добавлено: 08.03.06 13:09
Finalize не вызывается до сборки мусора. Более того, если реализован
Finalize, то объект будет жить еще дольше, он переживет одну сборку
мусора, при которой будет помещен в специальную очередь финализируемых
объектов, и реально уничтожится лишь при следующей сборке мусора.

Ответить

Номер ответа: 7
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #7 Добавлено: 08.03.06 14:58
Есть такая старинная китайская пословица :)
Чисто не там, где метут, а там где не сорят.

Вместо того, чтобы надеяться на уборщик мусора, лучше избавиться от того, кто мусорит :)
Тем более, что уборщик не справляется.

Ответить

Номер ответа: 8
Автор ответа:
 AVD



Вопросов: 4
Ответов: 9
 Профиль | | #8 Добавлено: 09.03.06 15:13
Моя маленькая прога просто работае с графикой и загружает в память от 6 до 12 картинок, различных расширений. От этого размер конечно получается большой...
К сведению, каждую процедуру я начинаю с обьявления переменных/работаю с ними/а в конце убиваю вручную.Давно себя приучил(если конечно это слово применительно. Сел за комп 1 год назад.) в конце процедуры убирать за собой сам.
SNE лично тебе. Я умом не блещу, но смотреть на во время Runtim'a - это полная х..ня.А тебе наверное череп жмёт...

Ответить

Номер ответа: 9
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #9 Добавлено: 09.03.06 15:31
Что же в таком случае грузит пустой проект, и что занимает 10 Мб?

Ответить

Номер ответа: 10
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #10
Добавлено: 09.03.06 16:37
AVD

Убирать переменные, это хорощий тон.
Если не секрет покажи, как ты это делаешь.

Допустим класс String.

 ;Dim str1 As [String] = "MACHINE"

И как ее убить?

А насчет Runtim'a... Точнее CLR (Common Language Runtime ) .

1.Ты пишете исходный код.
 
2.Затем компилируешь его в ЕХЕ-файл.
 
3.Компилятор создает MSIL-код и помещает в раздел "только-на-чте-ние" выходного файла стандартный РЕ-заголовок (признак машино-независимой выполняемой программы для Win32). Здесь появляется очень важная деталь: при создании выходного файла компилятор импортирует из CLR функцию _CorExeMain.

4. Когда приложение начинает выполняться, ОС загружает этот РЕ (впрочем, как и обычный РЕ), а также все нужные DLL, в частности, библиотеку, которая экспортирует функцию _CorExeMain (mscoree.dll).

Ответить

Номер ответа: 11
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #11 Добавлено: 09.03.06 21:59
Вся виртуальная машина .NET занимает 10 мегов. Вот она в меморях и засела. Переходи на Delphi-там хоть чуть-чуть меньше...

Ответить

Номер ответа: 12
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 10.03.06 09:31
SNE лично тебе. Я умом не блещу, но смотреть на во время Runtim'a - это полная х..ня.А тебе наверное череп жмёт...


Видимо тебе череп уже не то что жмет, а все выжал... На форуме не матерятся, и не оскорбляют друг друга!
Тебе хочут сказать что у точки 20 метров ран-тайма (не знаешь что это, ищи, а не оскорбляй), пусть и не вся его часть загружается в память, но от этого и не на много легче!

Теперь про асемблер и пр. фигню, где при линковке можно вручную указать размер стэка и сам выделяешь/освобождаешь память... Если указать при линковке размер стэка поменьше, верно ведь, мегабайт не часто требуется :) То я вполне уписывался в 500Кб памяти :)

Ответить

Номер ответа: 13
Автор ответа:
 AVD



Вопросов: 4
Ответов: 9
 Профиль | | #13 Добавлено: 10.03.06 09:40
vito

Dim str1 As [String] = "Бронекопытные войска"
str1 = nothing 'я понимаю, что отводимая память под переменную не высвобождается, однако нехрен там валятся всякой ерунде. Ну а если у обьекта есть метод dispose - его вызываю. (Надеюсь мой я в дружбе со своей головой :))

Подска жи, будь добр, как мне сделать пустой проектик, который после построения решения не весил хотя бы 5МБ.
Возможно, я что-то натворил в настройках компилятора! Если так, то что это может быть???

Ответить

Номер ответа: 14
Автор ответа:
 AVD



Вопросов: 4
Ответов: 9
 Профиль | | #14 Добавлено: 10.03.06 09:45
sne

Да, ты прав. Извеняюсь за своё высказывание.
Просто тупые приколы от армии остались...
(ПРИЗНАЮ СВОЮ ОШИБКУ...)

Ответить

Номер ответа: 15
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #15
Добавлено: 10.03.06 11:43
AVD

Dim str1 As [String] = "Бронекопытные войска"
str1 = nothing

Это не убъет переменную( а точнее экземпляр класса), а просто обнулит.

Примерно то же самое будет
str1 = ""

То есть под этот экземляр класса будет выделена память.
А освобождена она будет, когда сборщик мусора, решит это сделать и данный экземляр класса перестанет существовать в памяти.
Либо ты можешь переопределить метод Finalize( деструктор класса), он освободит память.

Это автоматизация, и в принципе это неплохо, правда смотря для каких задач.

Что касается 5 метров. Это очень даже реально, только разделяй память для прораммы и память для рантайма. От этих примерно 10 метров на старте ты никуда не денешься. А сама прорамма может занимать 2- 3 метра. Хотя в общей сложности будет вылядеть как 12-13 метров.

З.Ы.

Ради интереса запусти два экземляра одной прораммы. А потом сверни - разверни и удивишься как изменится объем памяти занимаемой программой. Рантайм выгрузил уже не нужные компоненты, сделал все необходимое, и чудо - пустой проект занимает 1 -1,5 метра.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам