托管资源

托管资源和非托管资源

  • 托管资源
    • 由Clr跟踪和管理的内存资源,当我们创建一个对象时,Clr会为其分配一定数量的内存,并在对象不再需要时自动释放内存(由Clr负责管理的资源
    • 注意:
      • 回收资源,不需要自己控制,当然对象只针对托管资源(部分引用类型),不回收非托管资源。当像数组,用户定义的类,接口委托,Object,字符串等引用类型时,栈上保存着一个地址而已,当栈释放后,即使对象没用了,但是堆上分配的内存还在,只能等Gc手动时才能真正释放
    • 释放资源方式
      • using语法块和Dispose()方法
  • 非托管资源
    • 由操作系统或其他外部资源管理的资源,例如文件句柄,数据库连接,网络连接等,这些资源通常需要手动释放,否则会占用系统资源并影响程序性能(由操作系统或其他外部资源管理器负责管理的资源
    • 对于非托管资源,Gc只能跟踪非托管资源的生存期,而不知道如何去释放它
    • 释放资源方式
      • 继承IDisposable接口
      • Dispose(显式)(在其中释放托管资源和非托管资源,并将对象本身从垃圾回收期中移除,垃圾回收器不再回收此资源
        • 参数为True表示释放所有资源,只能由使用者调用
        • 参数为false表示释放非托管资源,只能由垃圾回收器自动调用
        • 如果子类有自己的非托管资源,可以重载这个函数,添加自己的非托管资源的释放
        • 重载此函数必须保证调用基类的版本,以保证基类的资源正常释放
        • 显式调用了dispose()方法,可以及时的释放资源,同时移除Finaliz()方法执行,提高性能
          img
      • 实现类的析构函数(在其中释放非托管资源)
        • 只能由垃圾回收器调用
          img
      • Finalize(隐式)
        • 用于基类不带close方法或者不带dispose显式方法的类,
  • GC
    • Clr为程度员提供的一种自动回收内存的管理机制(Gc回收)
    • Gc作用:
      • 当系统内部资源匮乏时,会自动取释放没有被使用的托管资源
posted @ 2023-06-16 15:00  乐天--  阅读(29)  评论(0)    收藏  举报