我正在使用 ANTS Memory Profiler 7.0 分析内存使用情况,并注意到控制台应用程序的非托管内存使用量约为 193MB(约 62%),该应用程序仅从大约 1000 万条记录中填充一些 DTO。
非托管内存的帮助文本说:
内存分配给不作为纯 .NET 代码运行的应用程序部分。这包括公共语言运行时本身、图形缓冲区和通过 P/Invoke 或 COM+ 访问的任何非托管数据
为什么这个数字会这么高?
我正在使用 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语句。