垃圾回收器算法

GC垃圾回收器算法
1如何找到垃圾
  1. 引用计数
该方法实现为:给每个对象添加一个引用计数器,每当有一个地方引用它时,引用计数值就+1,当引用失效时,引用计数值就-1,任何时刻引用计数值为0的对象就可以被回收,当一个对象被垃圾收集器收集时,被它引用的对象引用计数值就-1,所以在这种方法中一个对象被垃圾收集会导致后续其他对象的垃圾收集行动。
优点:简单、高效;
缺点:当两个对象相互引用的时候就无法回收,导致内存泄漏。
无法解决循环引用问题。(实际上没有任何对象引用,但其结果不为0)
  1. 根可达算法
为了解决对象间相互引用问题, Java 采用了可达性分析法,基本实现思路为:通过一系列 "GC Roots" 对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 "GC Roots" 没有任何引用链相连时,则称该对象是不可达的,此时,该对象还处于缓刑阶段,要真正宣判一个对象为可回收对象,至少要经历两次标记过程。
哪些对象可以作为  "GC Roots" ?
1 、通过 System Class Loader或者Boot Class Loader加载的class对象
2 、处于激活状态的线程
3 、栈中的对象
4 JNI栈中的对象
5 JNI中的全局对象
6 、正在被用于同步的各种锁对象
7 JVM自身持有的对象,比如系统类加载器等
2垃圾回收算法
  1. 标记清除
它是最基础的收集算法。
原理:分为标记和清除两个阶段:首先标记出所有的需要回收的对象,在标记完成以后统一回收所有被标记的对象。
特点:(1)效率问题,标记和清除的效率都不高;(2)空间的问题,标记清除以后会产生大量不连续的空间碎片,空间碎片太多可能会导致程序运行过程需要分配较大的对象时候,无法找到足够连续内存而不得不提前触发一次垃圾收集。
地方 :适合在老年代进行垃圾回收,比如CMS收集器就是采用该算法进行回收的。
  1. 拷贝算法
原理:它先将可用的内存按容量划分为大小相同的两块,每次只是用其中的一块。当这块内存用完了,就将还存活着的对象复制到另一块上面,然后把已经使用过的内存空间一次清理掉。
特点:没有内存碎片,只要移动堆顶指针,按顺序分配内存即可。代价是将内存缩小位原来的一半。
地方:适合新生代区进行垃圾回收。serial new,parallel new和parallel scanvage
收集器,就是采用该算法进行回收的。
复制算法改进思路:由于新生代都是朝生夕死的,所以不需要1:1划分内存空间,可以将内存划分为一块较大的Eden和两块较小的Suvivor空间。每次使用Eden和其中一块Survivor。当回收的时候,将Eden和Survivor中还活着的对象一次性地复制到另一块Survivor空间上,最后清理掉Eden和刚才使用过的Suevivor空间。其中Eden和Suevivor的大小比例是8:1。缺点是需要老年代进行分配担保,如果第二块的Survovor空间不够的时候,需要对老年代进行垃圾回收,然后存储新生代的对象,这些新生代当然会直接进入来老年代。
  1. 标记整理
原理:. 当存活的实例过多时,如果复制的话,效率不高,不合适老生代。 这时,把存活的对象标记出来,全部移动到一端,然后对另外一部分进行清除。
特点:不会产生空间碎片,但是整理会花一定的时间。
地方:适合老年代进行垃圾收集,parallel Old(针对parallel scanvange gc的) g1和Serial old收集器就是采用该算法进行回收的。
3堆内逻辑分区(适用分代垃圾回收,除Epsilon ZGC Shenandoah之外的GC都是使用逻辑分代模型,G1是逻辑分代,物理不分代,除此之外不仅逻辑分代,而且物理分代)
-Xms  堆内存的最小大小,默认为物理内存的1/64
-Xmx  堆内存的最大大小,默认为物理内存的1/4
-Xmn  堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn
其中TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个线程专用的内存分配区域。
如果设置了虚拟机参数 -XX:UseTLAB,在线程初始化时,同时也会申请一块指定大小的内存,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率。
 
总结:一般来讲,new了一个对象之后,看能不能在栈上进行分配,如果能够进行分配,直接入栈,在栈上的好处就是能够直接出栈结束,不需要到新生代老年代中进行GC操作。
其次看他对象的大小,如果太大,直接进入老年代,最后经过FGC结束自己的生涯。
如果不够大,经过TLAB不管有没有分配到线程内存,都会进入eden区,经过YGC清除,进入s1,下次清除根据年龄判断,超过年龄的直接进入老年区。其余的进入s2,如此往复进行。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值