c# - 如何查看非托管内存使用情况?

标签 c# .net visual-studio memory-leaks unmanaged

如何在 C# 项目的 Visual Studio 中查看和监控非托管内存使用情况?有没有办法在调试时检查分配的内存是否已被正确删除?

代码: pv_Memory = Marshal.AllocHGlobal(0x200000);

我正在尝试使用 Visual Studio 2015 中的“诊断工具”,可以看到内存在增加,但它似乎没有分离出非托管对象和内存。

有什么建议吗?谢谢。

配置: 1. Visual Studio 2015 2. C# 应用程序引用第 3 方 .NET 库,它是非托管库的包装器 3.Windows 7

最佳答案

当您使用 AllocHGlobal 时,您是从非托管 C/C++ 堆中进行分配。您可以使用堆分配跟踪来跟踪这一点。

class Program
{
    private static IntPtr pv_Memory;

    static void Main(string[] args)
    {
        Console.ReadLine();
        for(int i=0;i<10;i++)
        {
            pv_Memory = Marshal.AllocHGlobal(0x200000);
        }

        Console.WriteLine("Hello World!");
        Console.ReadLine();

    }
}

Windows 性能工具包中的 xperf 允许您附加到已运行的进程以获取堆分配数据。

enter image description here

您可以使用 WPA 查看数据。 一篇好文章在这里: http://blogs.microsoft.co.il/sasha/2014/12/02/diagnosing-native-memory-leaks-etw-wpa/

这很强大,但需要一些练习。

关于c# - 如何查看非托管内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44962472/

相关文章:

c# - 使用波浪号 (~) 存储路径并在 razor 中使用 html.raw 显示它

c++ - Qt 使用 singleShot Timer 从 QGraphicsScene 中删除 QGraphicsItem?

c# - 为什么 .ToString() 方法会破坏我的代码?

.net - 如何针对不同环境发布 .NET Core + Angular 单页应用程序?

c# - 如何使用单选按钮排列列表框中的项目

c# - 如何使用 string.Insert c# 在字符串中间插入撇号

c# - 性能分析 asp.net,什么是 ProcessRequestNotificationHelper?

c# 从 csv 中删除行

c++ - 如何修复 std::vector<int> WidthNumbers = 320, 640, 1280; 中的错误?

c# - 如何在不转到磁盘的情况下将字符串加载到 FileStream 中?