, , . , , unit test, , GC.GetTotalMemory . unit test .
, Microsoft.Diagnostics.Runtime a > ( ). :
public static void GetStats(ClrRuntime runtime)
{
ClrHeap heap = runtime.GetHeap();
var stats = heap.EnumerateObjects()
.Select(obj => new
{
Type = heap.GetObjectType(obj),
ObjectAddress = obj
})
.GroupBy(g => g.Type,
g => g.Type.GetSize(g.ObjectAddress))
.Select(gr => new
{
Name = gr.Key.Name,
Count = gr.Count(),
Size = gr.Sum(x => (int)x)
})
.Where(t => !t.Name.StartsWith("System.") &&
!t.Name.StartsWith("Microsoft.") &&
!t.Name.Equals("Free"))
.ToList();
Console.WriteLine("---------- Start ----------");
foreach (var item in stats)
Console.WriteLine("{0} {} {2}", item.Size, item.Count, item.Name);
}
:
var process = Process.GetCurrentProcess();
using (var dataTarget = DataTarget.AttachToProcess(process.Id, 1000, AttachFlag.Passive))
{
string dacLocation = dataTarget.ClrVersions[0].TryGetDacLocation();
ClrRuntime runtime = dataTarget.CreateRuntime(dacLocation);
GetStats(runtime);
List<User> list = new List<User>();
Enumerable.Range(1, 1000).ToList().ForEach(i => list.Add(new User() { Age = i }));
Thread.Sleep(10000);
GetStats(runtime);
}
: AttachFlag.Passive, :
"" , . , (, GC callstacks) **, .
, .