jvm垃圾回收
2015-06-27 13:00
260 查看
怎么判断对象是否存活呢?
只要有两种算法:
1,引用计数算法,给对象中添加一个引用计数器,每当一个有一个地方引用它时,计数器值+1,当引用失效,计数器-1。计数器为0时,说明对象不可能再被利用。
于是通知GC收集器,回收。这个算法思想很简单,但是存在问题,就是当两个对象互相持有对方的引用,而这两个对象在其他地方又没用处时,这两个对象将
永远不会被回收。
2,可达性分析算法,通过一系列“GC Roots”的对象作为起始点,开始向下搜索,搜索走过的路称为引用链,当一个对象到GC Roots没有任何引用链相连时,证明
该对象不可用。就可以判断为可回收对象。这一算法很好的解决了上面的问题。
但是,即使可达性分析算法中不可达的对象。也并非一定会被回收。
如果对象没有与GC Roots相连的引用链,他会被第一次标记,并筛选,筛选条件是是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者已经被finalize()
方法掉用过,虚拟机视为没有必要执行。如果被视为有必要执行,这个对象就会被放到一个F-Queue队列中,并在稍后,由一个虚拟机自动建立的低优先级线程Finalizer
去执行。但不承诺等待该线程运行结束。原因是,如果一个对象在finalize()中执行缓慢,或者发生了死循环,将有可能会导致F-Queue队列中其他对象永久等待,甚至
怎个内存回收系统崩溃。稍后,GC将对F-Queue进行最后一次小规模标记,只要对象与引用链中的任何一个对象建立关联,那么第二次标记就会被移出。就逃脱了死亡
的命运呢。
只要有两种算法:
1,引用计数算法,给对象中添加一个引用计数器,每当一个有一个地方引用它时,计数器值+1,当引用失效,计数器-1。计数器为0时,说明对象不可能再被利用。
于是通知GC收集器,回收。这个算法思想很简单,但是存在问题,就是当两个对象互相持有对方的引用,而这两个对象在其他地方又没用处时,这两个对象将
永远不会被回收。
2,可达性分析算法,通过一系列“GC Roots”的对象作为起始点,开始向下搜索,搜索走过的路称为引用链,当一个对象到GC Roots没有任何引用链相连时,证明
该对象不可用。就可以判断为可回收对象。这一算法很好的解决了上面的问题。
但是,即使可达性分析算法中不可达的对象。也并非一定会被回收。
如果对象没有与GC Roots相连的引用链,他会被第一次标记,并筛选,筛选条件是是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者已经被finalize()
方法掉用过,虚拟机视为没有必要执行。如果被视为有必要执行,这个对象就会被放到一个F-Queue队列中,并在稍后,由一个虚拟机自动建立的低优先级线程Finalizer
去执行。但不承诺等待该线程运行结束。原因是,如果一个对象在finalize()中执行缓慢,或者发生了死循环,将有可能会导致F-Queue队列中其他对象永久等待,甚至
怎个内存回收系统崩溃。稍后,GC将对F-Queue进行最后一次小规模标记,只要对象与引用链中的任何一个对象建立关联,那么第二次标记就会被移出。就逃脱了死亡
的命运呢。
相关文章推荐
- 金山毒霸占用80端口
- final关键字对JVM类加载器的影响
- win7 64BIT下使用VC2005的问题
- 网页抓取神器scrapy的安装搭建
- #define 的高级用法
- Spring 配置 工程Web.xml中encodingFilter
- Android -常见面试提问
- hibernate查询之Criteria实现分页方法(GROOVY语法)
- 环境变量设置错误导致全部命令无法使用解决办法
- 第十六周oj刷题——Problem E: B 构造函数和析构函数
- 3.24
- Linux中的常用内存问题检测工具
- BIPlatform高级功能之 基于WebService的维度建模
- Struts2的值栈
- 3.23
- 3.22
- CSS3绘图实例代码
- VLAN
- CSS3动画 transition和animation的用法和区别
- swift学习