这里的内容主要是关于引用类型的资源释放的,概念性的东西较多,有时候程序在退出时出现异常不好定位时,可以考虑一下是不是这方面的问题。
垃圾回收
垃圾回收是一个"
运行时"的核心功能,它的作用是回收不再被引用的对象所占用的内存。这里垃圾回收只负责回收内存,不负责清理资源(例如:文件句柄,数据库连接,网络端口等)垃圾回收还会根据是否存在任何引用来决定要清除什么。垃圾回收
只针对对象,分配在堆上的内存,如果维持对一个对象的引用时,回收器就无法回收了。
原理
垃圾回收器采用的是
mark-and-compact 算法 (mark 是指先确定所有可达对象,compact是指移动这些对象,使他们紧挨着存放)类似于磁盘碎片整理。在一次垃圾回收周期开始时,它要识别对象的所有的根引用(来自于静态变量, CPU寄存器, 局部变量或参数的实例的引用)。基于根引用列表,垃圾回收器就能遍历每个根引用标识的一个树形结构,并递归确定所有根引用指向的对象。这样垃圾回收器就能识别出所有可达对象。(正在被使用中的对象)
垃圾标识和回收
在执行垃圾回收时,垃圾回收器不是枚举所有访问不到的对象,它是通过移动所有相邻的可达对象来执行垃圾回收的。这样不可达对象(垃圾)的内存空间,就会被可达对象覆盖。为了定位和移动可达对象,要求系统在垃圾回收器运行期间保持一致的状态。为此,进程中所有的
托管线程都会暂停。会造成应用程序出现短暂的停顿ÿ