john1990_1 Ответов: 1

Как освободить оперативную память из приложения windows forms, удалив кэш истории элементов управления webbrowser?


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

Что я уже пробовал:

метода webbrowser1.Распоряжаться();
webbrowser1 = null;

И оперативная память все еще используется программой (видя, что в Диспетчере задач она не становится ниже).

OriginalGriff

Ссылка удалена: если вы не хотите, чтобы вас считали спамером (и забанили с сайта), не показывайте мне эту ссылку снова...
На этот раз, я думаю, это было чрезмерное изобилие, но дважды будет спам.

john1990_1

Ok, sorry.

OriginalGriff

Нет проблем - просто радуйтесь, что это не был один из наших более триггерных счастливых членов, который заметил его! :смеяться:

1 Ответов

Рейтинг:
1

OriginalGriff

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

Вызов Dispose не обязательно освобождает память обратно в кучу: это делается только сборщиком мусора и включается только тогда, когда куча заполняется.

Вы не можете "видеть" реальное использование памяти вашими приложениями в Диспетчере задач: это показывает использование памяти фреймворком. Чтобы увидеть, что делают ваши кучи (во множественном числе, потому что их несколько), Вам нужно использовать инструмент профилирования, такой как WinDbg или VS profiller: Диагностика проблем с памятью с помощью нового инструмента использования памяти в Visual Studio – Microsoft DevOps Blog[^]


john1990_1

Спасибо, это так сложно, любой простой способ суммировать его, чтобы добавить строки кода в мою программу?

OriginalGriff

Нет, это не проблема типа "строки кода". Вы пытаетесь контролировать *как* работает ваше приложение, вы не делаете этого изнутри приложения, поскольку это меняет способ его работы.
Немного похоже на попытку засечь время марафонцев, привязав дедушкины часы к каждому из них: это работает, но меняет скорость, с которой они бегут!

john1990_1

Я понимаю от вас, что когда куча заполняется, сборщик мусора включается и освобождает кэш элементов управления webbrowser (после вызова webbrowser1.Dispose ()), и мне не нужно беспокоиться о том, что оперативная память моих пользователей будет заполнена?

OriginalGriff

Это очень сложно ...

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

Сложности возникают, когда вы понимаете, что существует несколько куч: три кучи поколения и большая куча объектов (более поздняя не уплотняется ... если только вы не скажете об этом в V4.5.1 и более поздних версиях) ... если только .NET не работает в режиме сервера, то в этом случае он выделяет отдельные кучи каждому логическому процессору, чтобы операции GC могли выполняться параллельно ...

https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/large-object-heap

В принципе, если вам действительно не нужно знать, просто игнорируйте память и предполагайте, что система позаботится о ней! :смеяться:
Это увлекательная вещь (если вам нравятся такие вещи, а мне нравятся), но в целом вам не нужно беспокоиться об этом.

There is also the added complication that "memory" isn't just the space you store stuff in, Windows also considers Handles as "memory" and it's very possible (even easy) to run out of Handles long before you start approaching the memory limits of your machine. When you do, you get an "Out of memory" error despite the GC and / or actual memory allocation not being involved at all! That's why it's important to "tidy up" after yourself with any Graphics objects such as Fonts, Brushes, Pens, ... and to remember that each Window requires a Handle, and that each Control is at least one window, sometimes many, many more. Disposing of handles is very important!

Dave Kreskowiak

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

Когда ваше приложение запускается, то .Чистая среда CLR просит электроприводом для блока памяти. Блок становится управляемой кучей для вашего приложения. По мере запуска приложения и выделения объектов среда CLR выделяет им память из управляемой кучи. Часть кучи используется, часть-нет, но она готова к использованию вашим приложением.

Если в среде CLR недостаточно доступной кучи, она запросит у Windows еще один блок и добавит его в управляемую кучу.

Если Windows работает на низком уровне, он спросит об этом .Сеть, чтобы вернуть память обратно к нему. CLR с радостью удалит память из своей управляемой кучи и вернет ее обратно в Windows.

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