概述Java垃圾回收机制

回收机制的目的:
Java回收机制是为了避免内存溢出异常。

#判断对象“已死”的方法
1:引用计数器的方法
基本思路:给对象中添加一个引用计数器,每当有一个地方应用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能在被利用的,即对象已死。
特点:实现简单,判定效率也比较高。
注意:Java语言中没有使用引用计数器的方法,主要原因时因为,引用计数器的方法很嫩解决对象之间的相互循环引用的问题。
当两对象相互引用之后,计数器的值一直为1,不能被回收。但是实际上这两个对象已经不能再被访问了,应该被回收。

2:根搜索算法(GC Roots Tracing)
基本思路:通过一系列命名为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象时不可用的。即,只要一个对象,或者一部分对象它们到GC Roots是不可达的,则它们将会被判定为是可回收的对象。
在这里插入图片描述

对于Object5,Object6,Object7的处理。
由于它们和GC Roots都没有链接,所以,会被判定为可回收对象。不过不代表一定会被回收。在判定与GC Roots没有链接之后,考察其是否有必要执行finalize()方法,会被进行第一次标记,并且筛选。
当对象没有覆盖finalize()方法,或者finalize()方法已被虚拟机调用过。则都是为没必要执行。
如果被判为没必要执行,则该对象被回收。
如果被判定为有必要执行,则将对象放到F-Queue队列中,看对象是否能与引用链链接。连上不回收。
Java中可作为GC Roots的对象包含下面几种:
1;虚拟机栈中的引用对象 2;方法区中的类静态属性引用对象。3:方法区中的常量引用对象。4:本地方法栈中的引用对象。

引用
强引用:永远不会被回收。
软引用:内存溢出之前,会被列入回收范围之中并进行第二次回收。
弱引用:只要来及回收机制工作,都会被回收。
虚拟引用:对象在回收时收到一个系统通知。

垃圾回收算法
1:标记-清除算法
基本思路:标记出需要回收的对象,标记完成后统一回收被标记的对象。
缺点:效率不高,空间碎片太多,需要经常触发回收机制。
2:复制算法
基本思路:将内存按容量划分为两部分,每次使用一块,当这一块用完时,将还活着的对象复制到另一块上面。
缺点:缩小了内存。
优点:实现简单,运行效率高。
3:标记-整理算法
基本思路:将需要回收的对象进行标记,之后将所有存活的对象都向一端移动,然后,清理掉端边界以外的内存。
缺点:同样需要进行标记,效率不高。
4:分代收集算法
基本思路:将Java堆划分为新生代和老年代。对于新生代采用复制算法,堆老年代采用标记-清理或者标记-整理算法。
优点:将内存分代,更具备实用性。
缺点:需要额外的划分。

垃圾回收器
1:Serial收集器
进行垃圾回收时,必须暂停其他的所有工作线程。
2:ParNew收集器 可实现多线程收集。
3:Parallel Scavenge收集器
采用复制收集算法 多线程收集器 可达到一个可控制的吞吐量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值