.net应用程序的非托管堆大小

时间:2013-04-04 14:27:26

标签: c# memory heap unmanaged red-gate-ants

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

经过更多的实验,我尝试对一个程序进行类似的分析,该程序只对Console.ReadLine()指令进行阻止。我进行了分析并注意到发生了同样的事情。我的非托管堆慢慢增长。实际上,它实际上似乎只是在调用垃圾收集器时(通过快照功能)增长。现在为什么反复调用垃圾收集会导致非托管内存不可持续增加?这与ANTS有关吗?

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

3 个答案:

答案 0 :(得分:1)

来自SmartBear的

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

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

答案 1 :(得分: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();
            }
        }
    }
}

答案 2 :(得分:0)

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