内存回收

何时回收

1. window 报内存不足

2. 强制调用GC.Collect

3. 内存不足,正确说法是第0代对象充满时。

4. CLR卸载AppDomain,GC将所有代龄的对象回收。

5. 物理内存不足

代龄(Generation):

为啥会有这个东西,因为内存回收后会留下内存“空洞”,需要挪动内存并且对对象重定位。这样很耗性能,所有就引入generation的东西,降低垃圾回收的频率。

微软强烈不建议通过GC.Collect方法来强制执行垃圾回收,因为会是对象代龄不断提升。

Finalize:

  1. C#不可以显示重写Finalize方法,只能通过析构函数来实现
  2. struct 不允许定义析构函数,只有class可以,且只有一个
  3. Finalize 不能被继承或重载。
  4. 执行垃圾回收之前系统会自动执行终止化操作。

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();
    }
}
原文地址:https://www.cnblogs.com/AlexHHC/p/3034222.html