我正在尝试对我正在研究的C#项目进行内存分析,以确定是否有任何泄漏,因为此应用程序需要尽可能接近100%的正常运行时间。我开始使用蚂蚁内存分析器版本7.4,并注意到我的非托管内存随着时间的推移不断增长,即使我的托管内存不是。
经过更多的实验,我尝试对一个程序进行类似的分析,该程序只对Console.ReadLine()
指令进行阻止。我进行了分析并注意到发生了同样的事情。我的非托管堆慢慢增长。实际上,它实际上似乎只是在调用垃圾收集器时(通过快照功能)增长。现在为什么反复调用垃圾收集会导致非托管内存不可持续增加?这与ANTS有关吗?
我想使用其他一些工具,最好使用windbg或SOS来确定它看到的非托管内存使用情况。现在对我来说知道其中的内容并不重要 - 尽管从长远来看这可能有助于调试。我只是想确定当前运行的应用程序的非托管内存使用情况。我想看看这是否真的是蚂蚁的问题或我对环境如何运作的误解。使用某种.net,visual studio或windows工具向我提供有关我的过程的准确信息将有助于我。
答案 0 :(得分:1)
AQTime可以很好地为托管和非托管代码提供内存分析。我的很多工作都是在托管和非托管边界,我多次使用它来查找内存泄漏。
如果您正在使用大块非托管内存,请务必致电GC.AddMemoryPressure
和GC.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,那么您无法正确管理非托管资源