//簡易版的記憶體用量觀察工具
// 透過觀察Managed Heap的總使用量變化
// 粗略推估某段程式所耗用的記憶體大小
class MemWatch
{
//比較記憶體使用量變化的基準值
private long _lastTotalMemory = 0;
//記憶體使用量變化
public long MemorySizeChange = 0;
//是否強制GC再測量記憶體用量
private bool _forceGC = false;
//可指定測量前是否要先做GC
//(可排除己不用但尚未回收的記憶體)
public MemWatch(bool forceGC)
{
_forceGC = forceGC;
}
public MemWatch() : this(false) { }
//保留測量開始之基準
public void Start()
{
_lastTotalMemory =
GC.GetTotalMemory(_forceGC);
}
//測量從Start()至今的記憶體變化
public void Stop()
{
MemorySizeChange =
GC.GetTotalMemory(_forceGC) - _lastTotalMemory;
}
//記憶體使用量變化(以KB計)
public string MemorySizeChangeInKB
{
get
{
return string.Format("{0:N0}KB",
MemorySizeChange / 1024);
}
}
//記憶體使用量變化(以MB計)
public string MemorySizeChangeInMB
{
get
{
return string.Format("{0:N0}MB",
MemorySizeChange / 1024 / 1024);
}
}
}
class Program
{
static void Main(string[] args)
{
//測試1-宣告byte陣列記憶體使用
//利用MemWatch觀察Heap記憶體使用狀況
MemWatch mw = new MemWatch();
//宣告前先記錄使用前的記憶體用量
mw.Start();
byte[] b1 = new byte[512 * 1024];
//宣告後再測一次
mw.Stop();
//會得到二次的記體變化差距為512KB
Console.WriteLine(mw.MemorySizeChangeInKB);
//測試2-這次宣告byte陣列後立即棄用,但不做GC
mw.Start();
byte[] b2 = new byte[256 * 1024];
b2 = null;
mw.Stop();
//b2佔用記憶體已釋出,但尚未回收,結果為256KB
Console.WriteLine(mw.MemorySizeChangeInKB);
//進行下一階段測試前先強制GC
GC.Collect();
//測試3-同2,但換成先GC才測記憶體大小的測量模式
mw = new MemWatch(true);
mw.Start();
byte[] b3 = new byte[256 * 1024];
b3 = null;
mw.Stop();
//MemWatch測量時會先將b2釋出的記憶體回收,故結果為0KB
Console.WriteLine(mw.MemorySizeChangeInKB);
Console.Read();
}
}