c# - 为什么非托管内存可能占控制台应用程序使用的内存的 60% 以上?

标签 c# .net memory memory-management red-gate-ants

我正在使用 ANTS Memory Profiler 7.0 分析内存使用情况,并注意到控制台应用程序的非托管内存使用量约为 193MB (~62%),该应用程序仅从 1000 万条左右的记录中填充一些 DTO。

非托管内存 的帮助文本说:

The memory is assigned to the parts of the application that aren't running as pure .NET code. This includes the common language runtime itself, graphics buffers and any unmanaged data accessed through P/Invoke or COM+

为什么这个数字会这么高?

最佳答案

访问数据库时,您将不可避免地使用非托管代码。引擎的接口(interface)始终是已经存在很长时间的代码,早于 .NET 并由提供互操作的托管类包装。对于 SQL Server 和任何搭载 OleDb 或 ODBC 的提供程序来说都是如此。

这些托管类将始终实现 IDisposable,因此您可以尽早释放 native 提供程序消耗的资源。忘记这样做很常见,很少有人注意到。除了看到进程运行“繁重”之外,似乎无缘无故地消耗了大量句柄和非托管内存。当垃圾收集器运行不够频繁时尤其如此,您可以在 Perfmon.exe 中看到这一点。因此,除了不使用 Dispose 之外,部分问题可能是您没有对这些 DTO 对象做足够的工作,还没有获得足够的 GC 搅动。

检查您的代码并确保在需要时使用 Dispose() 和 using 语句。

关于c# - 为什么非托管内存可能占控制台应用程序使用的内存的 60% 以上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12248527/

相关文章:

c# - Linq 到实体。空引用异常

c# - 在 UWP WebView 控件中显示本 map 片

c# - C# 中的内联辅助方法

pointers - 为什么后续的 Rust 变量会递增堆栈指针而不是递减它?

java - JDBC4Connection 中的内存泄漏

c# - iTextSharp ShowTextAligned anchor

c# - WCF 向客户端发送事件

.net - 使用 Reflector,为什么我看不到嵌入在 .NET 应用程序中的 app.manifest?

c# - 使用 .NET/WMI 获取 PC 的显示器信息

java - 保存大文件时出现内存不足错误