Java垃圾回收器

引用记数:一种简单但速度很慢的技术,每个对象都含有一个引用计数器,当引用连接值对象时,引用记数加1,;当引用离开作用域或被置为null时,引用记数减1,遍历所有对象,管理引用计数的开销不大,但这项开销在整个程序生命过程中持续发生。
缺陷在于如果对象之间存在循环引用,可能出现"对象应该被被回收,但引用记数不为0",定位交互引用的的对象组所需工作量极大。常用来说明垃圾收集的工作方式,未被应用于任何一种Java虚拟机中。

在一些更快的模式中,垃圾回收器并非基于引用计数技术,它们依据的思想是:对任何活的对象,一定能追踪到其存活的堆栈或静态存储区之中的引用,这种方式确保了你访问过的对象必须是活的。这就解决了"交互自引用的对象组"的问题,
在这种方式下,Java虚拟机将采用一种自适应的垃圾回收技术。
有一种做法名为"停止--复制",即先暂停程序运行,然后将左右存活的对象从当前堆复制到另一个堆,没有被复制的全是垃圾。当对象被复制到新堆,它们是一个挨着一个的,所以新堆保持紧凑排列。对于这种"复制回收器"而言,效率会降低,首先得有两个堆,维护比实际需要多一倍的时间,
其次在于复制,项目稳定后很少甚至不产生垃圾,尽管如此,复制回收器仍然将所有的内存自一处复制到另一处,这很浪费。为了避免这种浪费,一些Java虚拟机会进行检查:要是没有新垃圾产生,就会转换到另一种工作模式,称为"标记--清扫"。
"标记--清扫"的思路同样是从堆栈和 静态存储区出发,遍历所有的引用,进而找出所有存活的对象,当找到一个存活对象,就会给对象设一个标记,这个过程不会回收任何对象,只有当标记工作全部完成后,才会开始清理工作,没有标记的对象将被释放,不会发生任何重复动作。所以剩下的
堆空间是不连续的垃圾回收器通过重新整理剩下的对象得到连续的堆空间。
如果所有的对象都很稳定,垃圾回收器的相率降低的话,就切换到"标记--清扫"方式,虚拟机会跟踪"标记--清扫"的效果,如果堆空间出现很多碎片,就切换回"停止--复制"方式,这边是"自适应技术"。
阅读更多
个人分类: java编程思想
上一篇web页面添加使用excel表格批量导入功能
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭