13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
|
|
1 | |
Как уменьшить количество потребляемой памяти17.03.2009, 22:31. Показов 14484. Ответов 19
Метки нет (Все метки)
Написал простенькую консольную програмку с несколькими классами.
В диспечере задач она занимает не меньше 11 мб памяти. хотелось бы уменьшить. может есть какие-то параметры для компилятора или CLR для уменьшения расхода памяти?
0
|
17.03.2009, 22:31 | |
Ответы с готовыми решениями:
19
Как уменьшить объём потребляемой оперативной памяти? Как уменьшить объём потребляемой оперативной памяти программой? Ускорить загрузку программы и уменьшить количество потребляемой памяти Большой размер потребляемой оперативной памяти приложением |
19 / 19 / 2
Регистрация: 16.03.2009
Сообщений: 36
|
|
17.03.2009, 23:24 | 2 |
Ну не видя кода твоей програмки сложно что то сказать, но распространенная ошибка это использование переменных например когда небольшие целые значения использовать int, а не long или вобще byte, ushort вместо ulong, дело в том что при неправильном назначении переменных система резервирует для них память на все знаки хотя по сути используется один или 2 из за этого большое выделение оперативной памяти.
0
|
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
|
||||||
17.03.2009, 23:31 [ТС] | 3 | |||||
Вот код. Она правда ведет себя как то странно - 1 раз вообще гдето 400 кб занимало а щас 3-4 мб. мне кажется это CLR выделяет "про запас"
0
|
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
|
|
18.03.2009, 03:01 | 4 |
Можно избавиться от коллекций. Коллекция выделяет память кратно 2. Если будет 4 элемента будет, выделено под 4 элемента. Если 5, то выделено будет 8. и т.д.
0
|
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
|
|
18.03.2009, 14:05 [ТС] | 5 |
я уверен это не снизит сильно расход памяти! ну сколько там занимают эти две строки? пару килобайт? темболее мне надо динамически менять местами данные в колекции и иметь возможность добавлять новые - если пользоваться массивами потери памяти будут в разы больше, т.к. каждый раз при любой операции будет создаваться копия массива
0
|
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
|
|
19.03.2009, 04:28 | 6 |
Дык, все остальное системные классы..
P.S. Не то, что бы вариант, но тем не менее. Если нужен минимум памяти, используйте не управляемый код, например C++.
0
|
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
|
||||||
21.03.2009, 22:42 [ТС] | 7 | |||||
нашел в инете один клас, который помогает снизить количество расходуемой памяти. периодически вызываеш единственный его метод - провоится сборка мусора и очистка памяти. вызываю раз 1 минуту - приложение занимает в памяти не больше 3 мб (хотя до этого 10 - 17 мб)
0
|
1 / 1 / 0
Регистрация: 24.03.2009
Сообщений: 9
|
|
24.03.2009, 20:45 | 8 |
Опиши для каждого класса деструктор (финализатор) и в конце приложения вызови сборщик мусора (GC.Collect()) . Помогает
0
|
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109
|
||||||
25.03.2009, 00:49 | 9 | |||||
Зачем для каждого класса финализатор писать? Это только уменьшит производительность и удлинит сборку мусора. Достаточно просто вызвать сборщик мусора.
1
|
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
|
|
25.03.2009, 01:06 | 10 |
онне нужно вызывать он сам вызывается перед закрытием
0
|
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
|
|
25.03.2009, 02:25 | 11 |
0
|
1 / 1 / 0
Регистрация: 24.03.2009
Сообщений: 9
|
|
25.03.2009, 19:42 | 12 |
Ещё можно сократить неиспользуемые namespace.....
У меня кстати была точно такая же проблема. Простенький консольный ICQ клиент узурпировал 20 мб памяти.... Но на проверку, в солюшене я увидел два файла-обычный exe и некий .vshost.exe.... В диспетчере,при запуске приложения из VS2008 был именно последний. После закрытия VS, и запуска обычного exeшника (из папки солюшена) оказалось что он занимает 7 мб...... Чем это обусловлено-понятия не имею..
0
|
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
|
|
26.03.2009, 00:23 [ТС] | 13 |
Зачем для каждого класса писать финализатор??? И что в нем писать? Вы хоть знаете зачем они нужны вообще? И что такое "конец приложения" интерестно бы узнать
Добавлено через 2 минуты 6 секунд А что это за бред? Почитайте пожалуйста хоть немного теории (в особенности значение пространств имен) прежде чем чтото советовать
0
|
326 / 159 / 45
Регистрация: 06.12.2012
Сообщений: 305
|
|
26.03.2009, 01:22 | 14 |
Мда вы конечно меня извините, или исправте вдруг чего... Но int, long, byte etc. разве в С# не структура и говорить о 8,4, 2, 1 байт(-ов) выделение памяти на стоко глуппо... Когда вы создадите переменную 1кб как минимум будет...
Одним словом задайте переменную и на типе нажмите Go-to definition.... И вы увидите скока еще разного-- иногда ненужного подгружается...
0
|
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
|
|
26.03.2009, 10:59 [ТС] | 15 |
в целом согласен - это не С++ типы, но для отдельной переменной в памяти держится только значения полей, а все методы хранятся на уровне класса, т.е. для всех экземпляров для этого класа они одни и те же. Так что вполне может быть столько и занимает отдельная переменная (sizeof(int) выдает 4 ), правда быстродействие полюбому пониже чем у аналогов в С++.
0
|
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
|
|
26.03.2009, 16:15 | 16 |
Как бы не было по любому под байтовую переменную выделяется меньше памяти
Добавлено через 2 часа 33 минуты 51 секунду Если есть классы где не используешь наследование,то воспользуйся структурами
0
|
1 / 1 / 0
Регистрация: 24.03.2009
Сообщений: 9
|
|
26.03.2009, 18:52 | 17 |
1.Деструкторы используются для уничтожения экземпляров классов.Деструктор неявным образом вызывает метод Finalize для базового класса объекта.Писать в нём ничего не нужно. Под фразой "конец приложения" я имел ввиду окончание метода Main. 2.Спасибо,прочитал. 3. Вы бы лучше не искали чужие ошибки,а попытались помочь людям.
0
|
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
|
|
26.03.2009, 19:11 [ТС] | 18 |
Зачем в моем примере явно вызывать деструкторы? Свои создаю единоразово и они мне нужны все время. Темболее Finalize используется только для освобожденя неуправляемых ресурсов. В управляемой памяти все за вас сделает сборщик мусора
зачем вызывать сборщик мусора в конце Main? Когда будет конец Main - приложение завершится и автоматически выгрузится из памяти. Ктомуже если вы заметили в моем случае - у меня бесконечный цикл в Main - следовательно выполнение до конца Main никогда и не дойдет. Вы наверно имели ввиду ссылки на используемые стандартные библиотеки - так вот это никаким образом не влияет на количество используемой памяти, код из стандартной библиотеки компилируется и загружается в память только тогда, когда используется, следовательно ни на размер исполняемого файла, ни на занимаемое место в памяти они не влияют. я нечего не советую если не разбираюсь в данном вопросе по крайней мере хорошо, а с учетом того что я только начал учить С# мне толком то нечего и посоветывать никому
0
|
27 / 27 / 2
Регистрация: 09.12.2008
Сообщений: 138
|
|
27.03.2009, 01:53 | 19 |
можно утилитой Ngen.exe создать откомпилированный вариант без ИЛ кода, или смотреть не на дебаг версию файла а сделать релис.
0
|
85 / 85 / 6
Регистрация: 13.10.2008
Сообщений: 144
|
|
30.03.2009, 19:49 | 20 |
Возник вопрос по теме: почему при простом перемещении(или resize'е) окна приложения увеличивается тот самый working set, что отображается в диспетчере задач?
0
|
30.03.2009, 19:49 | |
30.03.2009, 19:49 | |
Помогаю со студенческими работами здесь
20
Увеличение потребляемой памяти Как уменьшить размер потребляемой памяти? Помогите уменьшить объем потребляемой ОЗУ Как бороться с увеличением объема потребляемой оперативной памяти при сохранении файла Excel без закрытия? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |