Kof*_*rfo 4 .net c# memory memory-management red-gate-ants
我正在使用ANTS Memory Profiler 7.0分析内存使用情况,并注意到控制台应用程序的非托管内存使用量大约为193MB(约62%),只比1000万左右的记录填充一些DTO.
非托管内存的帮助文本说:
内存分配给应用程序中未作为纯.NET代码运行的部分.这包括公共语言运行时本身,图形缓冲区以及通过P/Invoke或COM +访问的任何非托管数据
为什么这个数字会如此之高?
访问数据库时,您将不可避免地使用非托管代码.引擎的接口总是代码已经存在了很长时间,早于.NET,并由提供互操作的托管类包装.适用于SQL Server和任何背靠OleDb或ODBC的提供程序.
这些托管类将始终实现IDisposable,因此您可以尽早释放本机提供程序所消耗的资源.忘记这样做很常见,很少注意到.除了看到流程"重"之外,似乎消耗了大量的句柄和非托管内存,没有任何理由.当垃圾收集器运行不够频繁时会出现这种情况,这可以通过Perfmon.exe看到.因此除了不使用Dispose之外,部分问题可能是你没有对这些DTO对象做足够的工作但还没有获得足够的GC流失.
检查您的代码并确保在需要时使用Dispose()和using语句.