内存回收
何时回收
1. window 报内存不足
2. 强制调用GC.Collect
3. 内存不足,正确说法是第0代对象充满时。
4. CLR卸载AppDomain,GC将所有代龄的对象回收。
5. 物理内存不足
代龄(Generation):
为啥会有这个东西,因为内存回收后会留下内存“空洞”,需要挪动内存并且对对象重定位。这样很耗性能,所有就引入generation的东西,降低垃圾回收的频率。
微软强烈不建议通过GC.Collect方法来强制执行垃圾回收,因为会是对象代龄不断提升。
Finalize:
- C#不可以显示重写Finalize方法,只能通过析构函数来实现
- struct 不允许定义析构函数,只有class可以,且只有一个
- Finalize 不能被继承或重载。
- 执行垃圾回收之前系统会自动执行终止化操作。
Dispose
实现
Class MyDispose:IDispose { private bool _isDisposed=false; private IntPtr _fileHandle; private MangeRes _managedRes; protected void Dispose(bool disposing) { if (!_isDispose) { if(disposing) { //Release mangage resource _managedRes.Dispose(); } if(_fileHandle!=IntPtr.Zero) { CloseHandle(fileHandle); _fileHandle = IntPtr.Zero; } } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } ~MyDispose() { Dispose(false); } public void Close() { Dispose(); } }