小议GC回收

简介: 听黄老大的.Net课还是比较喜欢听他讲.Net的机制,这段时间刚好讲到.Net的类型其中当然也讲到了栈、堆和GC。

听黄老大的.Net课还是比较喜欢听他讲.Net的机制,这段时间刚好讲到.Net的类型其中当然也讲到了栈、堆和GCNetGC是可以隐式地执行所有必要的内存管理任务。比如回收new出来的内存空间。当然这里的回收是指对纯托管的Net资源而言比如你用Net类库里的类写的线程、数据连接之类的东西。很多情况下,我们会不知不觉的使用非Net资源比如:文件、窗口或网络连接。虽然GC可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。如果要清理这些资源就必须重写析构函数或者Object.Finalize 方法(在垃圾回收回收 Object 之前尝试释放资源并执行其他清理操作).

GC使用名为“终止队列”的内部结构跟踪具有 Finalize 方法的对象。当创建具有 Finalize 方法的对象时,GC都在终止队列中放置一个指向该对象的项。托管堆中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项。如下图所表示objB就是重写了Finalize方法或析构函数的对象,而objA只是普通的纯Net对象:

GC执行回收时,它只回收没有终结器且在栈中已经不再被引用的对象的内存。但不能回收具有终结器的且在栈中不再被引用的对象的内存。而实现过 Finalize 方法的对象要被回收需要至少两次垃圾回收才能真正在托管堆中清除,释放内存资源.所以说实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。

当然如果在程序中使用了非托管资源的时候,就可以放心的大胆的去使用Finalize 方法或析构函数,因为不去释放资源的代价比冒险释放的代价更大,这里用冒险来形容似乎不太准确,但如果不注意方法确实是比较冒险的. 例如公共语言运行库关闭这种情况.

MS为程序开发者提供了IDisposable 接口来实现释放非托管资源和托管资源,该接口只有一个Dispose()方法.按照下面的这个模式来设计就没有错误了.

 

// 基类设计模式.
public class Base: IDisposable
{
  
//实现 IDisposable 接口必须实现Dispose().
   public void Dispose()
   {
     Dispose(
true);
     GC.SuppressFinalize(
this); //请求系统不要调用指定对象的终结器
   }

  
protected virtual void Dispose(bool disposing)
   {
     
if (disposing)
      {
        
// 在这里释放托管资源.
      }
     
// 在这里释放非托管资源.
     
// 将大对象字段在这里设置为null.
   }

  
// Finalize 方法或析构函数.
   ~Base()
   {
      Dispose (
false);
   }
}
// 继承子类的设计模式.
public class Derived: Base
{  
  
protected override void Dispose(bool disposing)
   {
     
if (disposing)
      {
        
// 在这里释放托管资源.
      }
     
// 在这里释放非托管资源.
     
// 将大对象字段在这里设置为null.
     
// Call Dispose  base class.
      base.Dispose(disposing);
   }
  
// 其中子类并不需要提供向父类
  
// 一样的public Dispose()方法
  
// 会从父类继承下来
}


目录
相关文章
|
算法 Java UED
JVM GC垃圾回收
JVM GC垃圾回收
157 3
JVM GC垃圾回收
|
1月前
|
缓存 算法 Java
GC垃圾收集算法
这篇文章详细讨论了垃圾收集(GC)的几种算法,包括引用计数、可达性分析、标记-清除、标记-复制和标记-整理算法,并介绍了这些算法的优缺点和适用场景。
27 0
GC垃圾收集算法
|
4月前
|
存储 安全 数据安全/隐私保护
旧电脑回收前怎么清除数据
随着技术迭代,处理旧电脑时需确保数据安全清除以防隐私泄露。步骤如下: 1. **备份重要数据**:转移到外部存储或云端。 2. **验证备份完整性**:确保无遗漏。 3. **准备系统安装工具**:如需重装系统。 4. **恢复出厂设置**:删除所有内容和个人设置。 5. **使用数据擦除工具**:如DiskGenius,彻底覆盖数据。 6. **物理销毁硬盘**:针对极度敏感数据。 确保数据安全的同时,还能循环利用旧设备。
|
Java
分代回收
分代回收
81 0
|
6月前
|
算法 Java
JVM GC 垃圾回收
【1月更文挑战第3天】JVM GC 垃圾回收
|
存储 算法 安全
GC相关的
GC相关的
58 0
|
缓存 算法 安全
JVM垃圾回收GC
这是JVM系列知识的最后一篇文章,本文围绕垃圾回收GC,涉及常用的垃圾回收算法,以及几种垃圾回收器。
94 0
|
算法 Java 程序员
【GC 垃圾收集器】
【GC 垃圾收集器】
|
Java 程序员
什么是GC
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
|
算法 Java
详解gc(垃圾回收)机制六:分代垃圾回收
详解gc(垃圾回收)机制六:分代垃圾回收
209 0
详解gc(垃圾回收)机制六:分代垃圾回收