Сокращение использования памяти приложений.NET?

Вы проверяли привязка Python для порта WebKit GTK + . В одном из каталога существуют демонстрации о том, как использовать его, включая браузер: python demos/tabbed_browser.py

Вы могли проверить также слайды FOSDEM Вершиной Toker на WebKit GTK + (PDF) гибрид Разработки Web/GTK + богатые интернет-приложения.

import gtk 
import webkit 

view = webkit.WebView() 

sw = gtk.ScrolledWindow() 
sw.add(view) 

win = gtk.Window(gtk.WINDOW_TOPLEVEL) 
win.add(sw) 
win.show_all() 

view.open("http://w3.org/") 
gtk.main()

, Который должен дать Вам хорошие подсказки для запуска.

107
задан Peter Mortensen 16 August 2011 в 07:48
поделиться

7 ответов

  1. You might want to check out Stack Overflow question .NET EXE memory footprint.
  2. The MSDN blog post Working set != actual memory footprint is all about demystifying the working set, process memory and how to perform accurate calculations on your total in-RAM consumption.

I will not say that you should ignore the memory footprint of your application -- obviously, smaller and more efficient does tend to be desirable. However, you should consider what your actual needs are.

If you are writing a standard Windows Forms and WPF client applications which is destined to run on an individual's PC, and is likely to be the primary application in which the user operates, you can get away with being more lackadaisical about memory allocation. (So long as it all gets deallocated.)

However, to address some folks here who say not to worry about it: If you're writing a Windows Forms application which will be running in a terminal services environment, on a shared server possibly utilized by 10, 20 or more users, then yes, you absolutely must consider memory usage. And you will need to be vigilant. The best way to address this is with good data structure design and by following best practices regarding when and what you allocate.

33
ответ дан 24 November 2019 в 03:43
поделиться

В этом случае вам нужно учитывать одну вещь - это стоимость памяти для среды CLR. CLR загружается для каждого процесса .Net и, следовательно, учитывает требования к памяти. Для такой простой / небольшой программы стоимость CLR будет преобладать над объемом памяти.

Было бы намного поучительнее создать реальное приложение и посмотреть его стоимость по сравнению со стоимостью этой базовой программы.

16
ответ дан 24 November 2019 в 03:43
поделиться

Приложения .NET будут занимать больше места по сравнению с собственными приложениями из-за того, что они оба должны загружать среду выполнения и приложение в процессе. Если вам нужно что-то действительно аккуратное, .NET может быть не лучшим вариантом.

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

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

  • Уменьшите количество объектов и убедитесь, что не держите их дольше, чем требуется.
  • Помните о List и подобных типах, которые удваивают емкость при необходимости, так как они могут привести к 50% потерь.
  • Вы можете рассмотреть возможность использования типов значений вместо ссылочных типов, чтобы увеличить объем памяти в стеке, но имейте в виду, что пространство стека по умолчанию составляет всего 1 МБ.
  • Избегайте объектов размером более 85000 байт, поскольку они будут перемещаться в LOH, который не уплотнен и поэтому может быть легко фрагментирован.

Это, вероятно, не исчерпывающий список, а всего лишь пара идей.

44
ответ дан 24 November 2019 в 03:43
поделиться

No specific suggestions per se, but you might take a look at the CLR Profiler (free download from Microsoft).
Once you've installed it, take a look at this how-to page.

From the how-to:

This How To shows you how to use the CLR Profiler tool to investigate your application's memory allocation profile. You can use CLR Profiler to identify code that causes memory problems, such as memory leaks and excessive or inefficient garbage collection.

7
ответ дан 24 November 2019 в 03:43
поделиться

Возможно, вы захотите посмотреть на использование памяти «настоящим» приложением.

Как и в Java, существует фиксированный объем накладных расходов для среды выполнения независимо от размера программы, но после этого потребление памяти будет гораздо более разумным.

6
ответ дан 24 November 2019 в 03:43
поделиться

Отвечая на общий вопрос в заголовке, а не на конкретный вопрос:

Если вы используете COM-компонент, который возвращает много данных (скажем, большие массивы 2xN двойников) и только небольшая часть необходимо, то можно написать COM-компонент оболочки, который скрывает память от .NET и возвращает только те данные, которые

Это то, что я сделал в своем основном приложении, и оно значительно улучшено потребление памяти.

1
ответ дан 24 November 2019 в 03:43
поделиться

Есть много способов уменьшить занимаемую площадь.

Одна вещь, с которой вам всегда придется жить в .NET , - это то, что размер собственного образа ваш код IL огромен

И этот код не может быть полностью разделен между экземплярами приложения. Даже сборки с NGEN не являются полностью статичными, в них все еще есть некоторые мелкие детали, требующие JIT-обработки.

Люди также склонны писать код, который блокирует память намного дольше, чем необходимо.

Часто встречающийся пример. : Получение Datareader, загрузка содержимого в DataTable только для записи в XML-файл. Вы можете легко столкнуться с OutOfMemoryException. OTOH, вы можете использовать XmlTextWriter и прокручивать Datareader, генерируя XmlNodes при прокрутке курсора базы данных. Таким образом, у вас будет в памяти только текущая запись базы данных и ее вывод XML. Который никогда (или вряд ли) получит более высокое поколение сборки мусора и, следовательно, может быть использован повторно.

То же самое относится к получению списка некоторых экземпляров, выполнению некоторых вещей (которые порождают тысячи новых экземпляров, которые могут остаться где-то есть ссылки), и даже если они вам не понадобятся впоследствии, вы все равно будете ссылаться на все до тех пор, пока не будет выполнен foreach. Explicitly null-ing your input list and your temporary by-products means, this memory can be reused even before you exit your loop.

C# has an excellent feature called iterators. They allow you to stream objects by scrolling through your input and only keep the current instance until you get the next one. Even by using LINQ, you still don't need to keep all of it around just because you wanted it to be filtered.

2
ответ дан 24 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: