/// <summary> /// /// </summary> /// <returns>true if memleak</returns> /// <param name="create"></param> /// <param name="cleanup"></param> /// <param name="start"></param> /// <param name="end"></param> /// <typeparam name="T"></typeparam> private Leaks PerformTest <T>(Func <T> create, Action <T> cleanup, int operationCount, out MemorySnapShot start, out MemorySnapShot end) { for (int i = 0; i < 5; i++) { Application.DoEvents(); Application.RaiseIdle(EventArgs.Empty); GC.Collect(); GC.WaitForPendingFinalizers(); _memoryService.HeapMinimize(true); } start = MemorySnapShot.Record(); for (int i = 0; i < operationCount; i++) { var o = create(); cleanup(o); o = default(T); } for (int i = 0; i < 5; i++) { Application.DoEvents(); Application.RaiseIdle(EventArgs.Empty); GC.Collect(); GC.WaitForPendingFinalizers(); _memoryService.HeapMinimize(true); } end = MemorySnapShot.Record(); return(IsMemoryLeak(start, end)); }
public string CompareToBaseLine(MemorySnapShot baseLine) { var sb = new System.Text.StringBuilder(); sb.AppendFormat(" {0} {1,5}Mbs change from base {2,5}Mbs\n", "total prog size : ", (long)ToMb(TotalProgSize), (long)ToMb(TotalProgSize - baseLine.TotalProgSize)); sb.AppendFormat(" {0} {1,5}Mbs change from base {2,5}Mbs\n", "resident : ", (long)ToMb(Resident), (long)ToMb(Resident - baseLine.Resident)); sb.AppendFormat(" {0} {1,5}Mbs change from base {2,5}Mbs\n", "share : ", (long)ToMb(Share), (long)ToMb(Share - baseLine.Share)); sb.AppendFormat(" {0} {1,5}Mbs change from base {2,5}Mbs\n", "text : ", (long)ToMb(Text), (long)ToMb(Text - baseLine.Text)); sb.AppendFormat(" {0} {1,5}Mbs change from base {2,5}Mbs\n", "data + stack : ", (long)ToMb(DataAndStack), (long)ToMb(DataAndStack - baseLine.DataAndStack)); sb.AppendFormat(" {0} {1,5}Mbs change from base {2,5}Mbs\n", "Mono Mem Size: : ", (long)ToMb(MonoManagedMemory), (long)ToMb(MonoManagedMemory - baseLine.MonoManagedMemory)); return(sb.ToString()); }
private Leaks IsMemoryLeak(MemorySnapShot start, MemorySnapShot end) { var ret = Leaks.None; // Check for managed memory if ((int)MemorySnapShot.ToMb(end.MonoManagedMemory) > (int)MemorySnapShot.ToMb(start.MonoManagedMemory)) { ret |= Leaks.Managed; } // Check for help leaks. if ((int)MemorySnapShot.ToMb(end.DataAndStack) > (int)MemorySnapShot.ToMb(start.DataAndStack)) { ret |= Leaks.Heap; } return(ret); }