Вы не указываете, как вы измеряете «потребление памяти» вашего приложения, но, возможно, вы используете диспетчер задач? Чтобы лучше понять, что происходит, я предлагаю вам изучить некоторые счетчики производительности для вашего приложения. Доступны как счетчики производительности кучи .NET, так и общие памяти процессов.
Если вы действительно хотите понять детали того, как ваше приложение использует память, вы можете использовать Microsoft CLR profiler .
То, что вы видите, может быть результатом расширения кучи .NET для размещения очень большого файла. Большие объекты помещаются в кучу больших объектов (LOH), и даже если в памяти .NET собирается мусор, свободная память никогда не возвращается в операционную систему. Кроме того, объекты на LOH никогда не перемещаются во время сбора мусора, и это может привести к фрагментации LOH, исчерпывающей доступное адресное пространство, даже если имеется много свободной памяти.
Кто-нибудь испытывал это при использовании PackagePart? Или я неправильно его использую?
Если вы хотите контролировать ресурсы, используемые пакетом, вы не используете его наилучшим образом. Пакеты одноразовые и, как правило, вы должны использовать их следующим образом:
using (var package = Package.Open(@"c:\test\1000pages.xps", FileMode.Open, FileAccess.ReadWrite, FileShare.None)) {
// ... process the package
}
В конце оператора using
ресурсы, используемые пакетом, уже освобождены или могут быть удалены сборщиком мусора.
Если вы действительно хотите сохранить _package
член вашей формы, вам следует в какой-то момент позвонить Close()
(или IDisposable.Dispose()
), чтобы освободить ресурсы. Вызов GC.Collect()
не рекомендуется и не обязательно сможет перерабатывать ресурсы, используемые пакетом. Любая управляемая память (например, буферы пакетов), доступная из _package
, не будет собираться мусором, независимо от того, как часто вы пытаетесь принудительно выполнить сборку мусора.