Dav*_*kes 1 c# memory-management
我的应用程序显示单个高分辨率图像.当我显示图像时,任务管理器显示350Mb的内存使用量,但GetTotalMemory返回2.5Mb,而CLRProfiler显示2.0Mb的根内存使用量
为什么将24M像素图像加载到未在GetTotalMemory或CLRProfiler中注册的BitmapImage对象?
操作图像的.NET Framework类,如System.Drawing.Bitmap和System.Windows.Media.Imaging.BitmapSource,是包装类.他们实际上并没有完成与成像相关的繁重工作,他们将工作转移到Windows中以前存在的成像api.System.Drawing使用GDI +,一组被调用的C函数.System.Windows使用WIC,即Windows Imaging Component,一个COM api.
当然,这些图像apis对GC堆一无所知.它们是用本机C++编写的,并使用操作系统提供的内存管理功能.像VirtualAlloc(),HeapAlloc()和MapViewOfFile().
因此,您无法使用托管内存分析器或GC类方法查看此本机代码占用的地址空间.不是你想要试图找到的东西,在.NET Framework中埋藏了很多这种pinvoke/COM互操作.一个像样的内存分析器(即不是CLRProfiler)可以让你知道有多少这个非托管地址空间被使用,但它不会像托管代码那样分解它.SysInternals的VMMap是一个不错的实用工具,价格合理,可以直观了解.
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |