java垃圾收集器基本知识

判读对象是否存活

引用计数法:

为每个对象添加一个引用计数器,每此被引用时计数器加一,解除引用计数器减一,计数器为零时确定不可能被使用。引用计数法实现简单高效,但简单的使用该方法无法解决一些问题。例如:当两个对象互相引用时计数器就永远无法归零

可达分析算法:

将对象作为一个图的节点,对象间的引用为图的边,确定一些被称作**“GC ROOTS”**的根节点作为起始,遍历整个图,所有不可达的节点的对象视为以死亡的对象。主流的商用程序语言的都是通过可达性分析来判断对象是否存活。通常以下引用会被作为GC ROOTS

  • 在虚拟机栈中引用的对象
  • 本地方法栈中引用的对象
  • 静态属性引用的对象
  • 方法区常量引用的对象
  • 被虚拟机内部引用,基本数据类型对应的class对象,如一些常驻的异常对象和系统类加载器
  • 被同步锁持有的对象
  • 反应虚拟机内部情况的一些对象

根节点的枚举方法:进行根节点枚举时,必须暂停所有用户线程。再Hotspot中使用一个被称为oopmap的数据结构,类加载完成时就可以计算出该类中对于偏移量中的数据类型。即时编译的过程中也会在特定位置记录下栈里和寄存器的那些位置存储着对象的引用。

引用:

JDK1.2以后java中的引用包括以下几种类型

  • 强引用,程序中普遍存在的引用,常规的引用赋值就是这种引用
  • 软引用,在内存溢出异常前,会把这些对象放进回收范围之中进行二次回收。使用SoftReference类 来实现软引用
  • 弱引用,弱引用对象只能存活到下一次垃圾回收收集前,只被弱引用的对象在发生垃圾收集时一定会被回收。使用WeakReference类来实现弱引用
  • 虚引用,虚引用是最弱的一种引用关系,虚引用的存在对对象的生存时间不会造成任何影响,也无法通过虚引用确定对象实例,虚引用的唯一意义在于对象回收时能得到通知,使用PhantomReference 类来实现虚引用

垃圾收集算法

分代收集理论:

分代收集建立在两个假说之上:

  1. 弱分代假说: 绝大多是对象都是朝生息灭的
  2. 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡

依据这个理论将对象按照熬过的垃圾收集次数分配到不同的区域存储,这样每次进行垃圾收集。时就只用对一部分进行垃圾收集。可能存在的问题就是对于通常使用的可达分析算法,如果存在不同区域的对象互相引用,例如老年代对象引用了新生代对象,那么可能需要将全体老年代对象加入到GC ROOTS中。
因为被老年代对象引用的新生代对象也很可能最终会进入老年代,所以存在被老年带引用的对象并不多。解决方法是在新生代建立一个被称为记忆集的的数据结构,把老年代内存分为多块,标记其中存在跨代引用的内存,将这块内存中的方法加入到GC ROOTS

标记 - 清除算法:

先标记出所以需要被回收的对象,再一次性统一回收被标记的对象。
可能存在的问题:如果大部分对象都要进行回收,那么会进行大量的标记和清除动作,效率不稳定。回收之后的空间是碎片化的,为之后的内存分配和访问增加了负担。

标记 - 整理算法:

针对标记 - 清除算法内存碎片化的问题,清除时不是简单的回收内存空间同时还将存活的对象向内存的一端移动。
标记 - 算理算法增加的内存收集时的开销,移动对象会造成很大的额外开销,但不移动会影响用户进程的效率。

标记 - 复制算法:

如果一块区域的大部分对象都会被回收,那么回收时就只需要保存下一小部分对象。根据这个想法,先将内存分为两块,进行垃圾收集时就只需要将不被回收的对象复制到另一块内存空间。再统一回收需要回收的内存空间。因为这个算法的前提,标记- 复制算法常用于进行新生代的垃圾收集。
优化,hotspot虚拟机中Secrial,Parnew等使用该方法的新生代垃圾收集器会将内存空间分为三块,一块较大的Eden空间和两块较小的Survivor空间,使用时只使用Eden空间和其中一块Survivor空间,垃圾收集时将存活的对象复制到另一块Survivor空间中,如果空间不足就使用另一块内存(通常为老年代)进行分配担保,存储无法被Survivior存储的对象。在Hotspot中Eden和Survivor默认比例为8比1。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值