3

我目前正在尝试对我正在处理的 C# 项目进行内存分析,以确定是否存在任何泄漏,因为此应用程序需要尽可能接近 100% 的正常运行时间。我开始使用 Ants Memory Profiler 7.4 版,并注意到我的非托管内存随着时间的推移不断增长,即使我的托管内存没有。

Console.ReadLine()经过更多的实验,我尝试对一个除了阻塞指令什么都不做的程序进行类似的分析。我进行了分析并注意到发生了同样的事情。我的非托管堆正在缓慢增长。事实上,它实际上似乎只是随着垃圾收集器被调用(通过快照功能)而增长。现在为什么反复调用垃圾收集会导致非托管内存无限增加?跟蚂蚁有关系吗?

我想使用其他一些工具,最好是诸如 windbg 或 SOS 之类的工具来确定它所看到的我的非托管内存使用情况。现在对我来说知道其中的内容并不重要——尽管从长远来看这可能有助于调试。我只是想确定当前正在运行的应用程序的非托管内存使用情况。我想看看这是否真的是蚂蚁的问题,还是我对环境如何运作的误解。拥有某种 .net、Visual Studio 或 Windows 工具来为我提供有关我的流程的准确信息将有助于我解决这个问题。

4

3 回答 3

1

SmartBear 的AQTime可以很好地为您提供托管和非托管代码的内存分析。我的很多工作都在托管和非托管边界中,我已经多次使用它来查找内存泄漏。

如果您正在使用大块非托管内存,请务必调用GC.AddMemoryPressureGC.RemoveMemoryPressure帮助 GC。

于 2013-04-04T14:46:18.203 回答
0

使用垃圾收集器分析器。如果存储桶 2 和 3 上的对象多于 1,那么您没有正确管理非托管资源

于 2013-04-04T14:37:25.613 回答
0

System.GC.GetTotalMemory(bool)可能是您正在寻找的。这是链接中带注释的示例:

using System;
namespace GCCollectIntExample
{
    class MyGCCollectClass
    {
        private const long maxGarbage = 1000;
        static void Main()
        {
            MyGCCollectClass myGCCol = new MyGCCollectClass();

            // Determine the maximum number of generations the system 
        // garbage collector currently supports.
            Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);

            myGCCol.MakeSomeGarbage();

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            // Determine the best available approximation of the number  
            // of bytes currently allocated in managed memory.
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of generation 0 only.
            GC.Collect(0);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of all generations up to and including 2.
            GC.Collect(2);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            Console.Read();
        }

        void MakeSomeGarbage()
        {
            Version vt;

            for(int i = 0; i < maxGarbage; i++)
            {
                // Create objects and release them to fill up memory 
                // with unused objects.
               vt = new Version();
            }
        }
    }
}
于 2013-04-04T14:35:05.780 回答