环境:
操作系统:WIN2003
开发环境:C#。NET
目的:对象型、值型、字符串型、图片、COM等在内存方面占用率进行分析。
用例一:一个类(test)里定义了6个字符串、每个付值为“22222”,4个窗体对象。循环1000次定义该类(test)的对象。
结果:
调用了释放方法:18.168~18.452
否
: 18.051~18.912
用例二:一个类(test)里定义了1个字符串、付值为“22222”,循环1000次定义该类(test)的对象。
结果:
调用了释放方法:18.076~18.334
否
: 18.064~18.304
用例三:一个类(test)里定义了一个窗体对象,循环1000次定义该类(test)的对象。
结果:
调用了释放方法:18.072~18.428
否
: 18.104~18.604
用例四:一个类(test)里定义了6个字符串、每个付值为“22222”,循环1000次定义该类(test)的对象。
结果:
调用了释放方法:18.068~18.432
否
: 18.076~18.640
用例五:一个类(test)里不定义任何变量,释放方法没有具体代码。循环1000次定义该类(test)的对象。
调用了释放方法:17.956~18.140
否
:17.876~18.104
总结:
以上数据明显看到:调用多一个方法本身都会增加内存。例如:只定义一个字符串的时候不调用释放方法所占用的内存是比调用还少。一个类里定义的对象增多后很明显,调用释放方法的内存明显降低了。
只有析构和释放方法时:(18.104-18.140-17.876+17.956)/1000*1024*1024=46字节
一个窗体对象占用内存((18.604-18.428)-(18.104-18.072))/1000*1024*1024=675字节
一个5位的字符串占用内存((18.640-18.432)-(18.076-18.068))/6000*1024*1024=35字节
代码:
using
System;
namespace
gc
{
///<summary>
/// Gc
的摘要说明。
///</summary>
[Serializable]
public class Gc : System.IDisposable
{
public Gc()
{
//
// TODO:
在此处添加构造函数逻辑
//
}
//
供程序员显式调用的Dispose方法
public void Dispose()
{
Dispose(true);
//
调用带参数的Dispose方法,释放托管和非托管资源
System.GC.Collect();
System.GC.SuppressFinalize(this);
//
手动调用了Dispose释放资源,那么析构函数就是不必要的了,这里阻止GC调用析构函数
}
protected virtual void Dispose(bool disposing)
//protected
的Dispose方法,保证不会被外部调用。
//
传入bool值disposing以确定是否释放托管资源
{
if (disposing)
{
//
在这里加入清理"托管资源"的代码,应该是xxx.Dispose();
}
//
在这里加入清理"非托管资源"的代码
}
~Gc()
//
供GC调用的析构函数
{
Dispose(false);
//
释放非托管资源
}
}
}