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