Какой разумный объем памяти для приложения .NET? - PullRequest
2 голосов
/ 02 декабря 2008

У меня было несколько жалоб на то, что одно из наших управляемых приложений использует 20-25 МБ ОЗУ. Я обычно отталкиваюсь и говорю, что память дешева; преодолеть это.

Разумно ли это для приложения Windows Forms?

Ответы [ 10 ]

7 голосов
/ 02 декабря 2008

20-25MB - ничто.

.NET Framework не всегда перерабатывает ОЗУ в любом случае. Со временем я видел, как приложения растут до нескольких сотен МБ ОЗУ во время «дорогого» процесса, а затем просто сидят там, даже когда «дорогой» процесс закончен. Однако это вводит в заблуждение. Приложение не использует эту оперативную память. Просто сборщик мусора еще не видел необходимости собирать много старой оперативной памяти. Если операционная система нуждалась в этой оперативной памяти, будьте уверены, что она будет собрана. Идея о том, что приложение должно использовать не более нескольких сотен килобайт, просто не применима в управляемой среде & mdash; для процессов операционной системы, да. Для родных приложений, возможно. Но не управляемый код. В противном случае вы просто получите системы с полным или большим объемом ОЗУ, которые просто простаивают.

4 голосов
/ 02 декабря 2008

Это довольно разумно, да. Выделение чуть большего объема памяти обходится дешевле, чем агрессивная попытка уменьшить размер кучи за счет GCing чаще.

4 голосов
/ 02 декабря 2008

Этот вопрос похож на вопрос: «Сколько яблок вы можете положить в комнату» ...

Сначала я бы ответил на вопрос: "Насколько большие яблоки" ...?

Тогда я бы возразил: "Насколько велика комната" ...?

Когда вы ответите на эти вопросы, можно дать приблизительную оценку. Хотя следует понимать, что даже приложение «Hello World» на .Net (и в том числе на Java) может занимать что-то от пары килобайт до нескольких сотен терабайт (теоретически), так как GC в основном построены так, что они распределяются жутко экстремальные объемы памяти в пуле в зависимости от объема доступной памяти. Таким образом, на компьютере с недостаточным объемом памяти приложение .Net WinForms может занимать небольшие объемы, тогда как в системе с огромным объемом свободной памяти оно может (теоретически) терабайт даже для «Hello World» ...

3 голосов
/ 02 декабря 2008

Что они на самом деле подразумевают под ОЗУ? Это рабочий набор, частный рабочий набор, виртуальная память и т. Д. И т. Д.? Я только что запустил довольно простое приложение .Net, и оно занимало 21 МБ рабочего набора, то есть 21 МБ ОЗУ. Но его личный рабочий набор составляет всего 4 МБ, поэтому около 17 МБ занято системными и общими библиотеками, которые будут использоваться, даже если мое приложение не будет загружено.

Затем я выполнил довольно объемную работу с приложением, и размер личного рабочего набора достиг 28 МБ. Затем я переключился на другое приложение, интенсивно использующее память, и увидел, что мой личный рабочий набор теперь составляет 8 МБ, несмотря на то, что память не была освобождена.

Использование ОЗУ приложением чрезвычайно сложно измерить, и еще сложнее определить, является ли использование памяти «слишком большим» (вне чего-то возмутительного, конечно).

Если ваш клиент не использует тщательно продуманные измерения счетчика производительности, чтобы указать на различные типы использования памяти, вы на самом деле не знаете, сколько памяти использует ваше приложение на своих компьютерах.

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

3 голосов
/ 02 декабря 2008

Существует потенциально веская причина для отказа: что, если ваш клиент использует ваше приложение в среде служб терминалов, а дюжина или более пользователей совместно используют 4 ГБ ОЗУ? Добавьте свои 20 - 25 МБ к 30+ в Outlook, 20+ для IE, 25+ для Word, 25+ для Excel и 25+ для Excel, умножьте на количество пользователей терминала, и, надеюсь, вы увидите, откуда они могут исходить. 1003 *

Я думаю, что в наше время 20-25 МБ вполне разумно. Если вы находитесь в сотнях мегабайт, это может быть другая история. Но это все зависит от обстоятельств.

2 голосов
/ 02 декабря 2008

Нет, это совершенно возмутительно. Вы называете себя программистом? Боже мой, мужик. Когда я начинал, я мог разместить пятнадцать приложений на одной перфокарте (которую я должен был пробить парой ржавых кусачек для ногтей на ногах, кстати). Все они выполнялись в течение пятнадцати циклов ЦП и фактически создавали память из ничего.

Тебе должно быть стыдно. Уходи в отставку сразу.

2 голосов
/ 02 декабря 2008

Это зависит от того, что делает приложение. 20 - 25Мб для меня не очень похоже.

Я только что создал очень простое приложение Windows Form, с очень небольшим количеством его, и это заняло 19 - 20 МБ. Я предполагаю, что это, вероятно, около минимального объема памяти, который занимает приложение форм .NET.

1 голос
/ 03 декабря 2008

Если ваши пользователи используют диспетчер задач для проверки использования памяти вашим приложением, вероятнее всего, они смотрят на столбец Использование памяти . Как говорит Стивен Мартин, это вводит в заблуждение, поскольку в этом столбце фактически отображается полный рабочий набор приложения. Это состоит из:

  • Рабочий набор private - резидентные страницы, которые являются частными только для вашего процесса.
  • Общий рабочий набор - резидентные страницы, которые могут использоваться другими процессами.
  • Рабочий набор shared - резидентные страницы, которые в данный момент доступны другим процессам. Это подмножество общего рабочего набора.

Если это так, вы можете немного поиграть, вручную уменьшив полный рабочий набор вашего приложения до его частного / общего рабочего набора. Это делается с помощью вызова Win32 API SetProcessWorkingSetSize (GetCurrentProcess (), -1, -1) . Это то, что Windows будет делать в любом случае, когда системе не хватает памяти, но контроль, когда это происходит, позволяет обрезать полный рабочий набор приложения .NET в его частный / общий рабочий набор. Это число обычно намного меньше.

Насколько меньше? Минимизация вашего приложения на панели задач делает то же самое, поэтому вы можете проверить, не меняя код.

1 голос
/ 02 декабря 2008

Что ты делаешь? Оправдывает ли это использование памяти около 20 полнометражных романов? Это определенно ваше приложение, а не только накладные расходы .net? У рассматриваемой машины мало памяти? Это ухудшает производительность?

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

0 голосов
/ 03 декабря 2008

Если вы неоднократно вызывали удивление из-за нехватки памяти в приложении, вам следует хотя бы немного взглянуть на то, действительно ли вам нужно это количество или это просто накопленная неэффективность. Сокращение объема памяти часто также приводит к увеличению скорости, а это, в свою очередь, повышает удовлетворенность клиентов. Часто такого рода жалобы могут также указывать на другие недостатки, которые просто выглядят так, будто с точки зрения пользователя происходит некоторое раздувание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...