Страница: 1 | 2 |
Вопрос: Не много ли оперативки хавает NET
Добавлено: 07.03.06 21:10
Автор вопроса: AVD
Недавно написал одну простенькую прогу и...
Засты в ступоре когда открыл диспечер задачь. Моя простенькая программа занимала 20 МБ оперативки. Потом ради прикола создал бустой проект и посмотрел сколько он занимает места в памяти. Я был просто в шоке - почти 10 метров.
Кто-нибудь подскажите что это за ерунда и как её можно побороть. Или надо перескакивать на С#.
Ответы
Всего ответов: 18
Номер ответа: 1
Автор ответа:
SerJ
Вопросов: 24
Ответов: 332
Профиль | | #1
Добавлено: 07.03.06 23:11
Хорошая программка, чё ж тут ещё скажешь!
ты хотя бы рассказал всем, что же делает эта твоя простенькая программка..
ЗЫ. А .NET сдесь не при чём! Скорее всего вина прокладки между монитором и крЕслом.
Номер ответа: 2
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #2
Добавлено: 08.03.06 00:20
C# будет так же.
Синтаксис другой - порочная философия та же
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 08.03.06 00:59
А что ты хотел хагрузив ран-тайм в память ) Хочешь малого размера выдляемой памяти, используй masm или жругой ассемблер
Номер ответа: 4
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #4
Добавлено: 08.03.06 03:53
Да здесь проблема не в том.
masm, tasm (мое любимое)), С, С++...
Проблема (или преимущество- для кого как) в сборщике мусора. Мы не можем сами освобождать ненужные ресурсы и будем ждать пока он это сделает сам.
А пустой проект, как сказал sne, грузит ран-тайм в память.
Языки, которые позволяют манипулировать памятью, лишены этого недостака, но обратной стороной медали будет большая трудоемкость. Кстати еще один довод почему .NET не рулит и ничего масштабного на этой технологии не пишется.
Как бы не были мощны современные копьтеры, они не резиновые.
AVD
Посему не переживай, это нормально, по мнению некоторых это прогресс... Возможно что и так....
Возможно ты использовал ресурсы, а сорщик мусора пока не счел нужным освободить память.
Обещано, что в конце концов он это сдеает, но сделает он это когда захочет)
Поэтому побороть нельзя. Но не забывай, в замен ты избавлен от кучи проблем.
Номер ответа: 5
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #5
Добавлено: 08.03.06 10:44
AVD
Хотя кое- что можно сделать.
Чтобы ускорить освобождение ресурсов вызывай принудительно сборщик мусора.
GC.Collect();
Или переопредели виртуальный метод Finalize, который есть у каждого объекта(он уничтожит объект в памяти).
Номер ответа: 6
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #10
Добавлено: 09.03.06 16:37
AVD
Убирать переменные, это хорощий тон.
Если не секрет покажи, как ты это делаешь.
Допустим класс String.
 im 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-сайт:
Профиль | | #12
Добавлено: 10.03.06 09:31
Видимо тебе череп уже не то что жмет, а все выжал... На форуме не матерятся, и не оскорбляют друг друга!
Тебе хочут сказать что у точки 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-сайт:
Профиль | | #15
Добавлено: 10.03.06 11:43
AVD
Dim str1 As [String] = "Бронекопытные войска"
str1 = nothing
Это не убъет переменную( а точнее экземпляр класса), а просто обнулит.
Примерно то же самое будет
str1 = ""
То есть под этот экземляр класса будет выделена память.
А освобождена она будет, когда сборщик мусора, решит это сделать и данный экземляр класса перестанет существовать в памяти.
Либо ты можешь переопределить метод Finalize( деструктор класса), он освободит память.
Это автоматизация, и в принципе это неплохо, правда смотря для каких задач.
Что касается 5 метров. Это очень даже реально, только разделяй память для прораммы и память для рантайма. От этих примерно 10 метров на старте ты никуда не денешься. А сама прорамма может занимать 2- 3 метра. Хотя в общей сложности будет вылядеть как 12-13 метров.
З.Ы.
Ради интереса запусти два экземляра одной прораммы. А потом сверни - разверни и удивишься как изменится объем памяти занимаемой программой. Рантайм выгрузил уже не нужные компоненты, сделал все необходимое, и чудо - пустой проект занимает 1 -1,5 метра.