GC简介和垃圾回收算法

GC就是回收不再使用的对象,调用析构函数finalize方法,和构造对应,就是这都是内部的,也可以自己调用,手动释放对象。
在这里插入图片描述

新生代,老年代,永久代

新生代又包括Eden(伊甸园)区和两个Survivor区(from,on幸存区),比例是8:1:1,可见大部分存活不长,对象主要分配在新生代的Eden区上,少数分在老年代。

GC后年代更替流程

Java虚拟机每次使用新生代中的Eden和其中一块Survivor(From),

  • 在经过一次Minor GC后,将Eden和Survivor中还存活的对象一次性地复制到另一块Survivor(to)空间上(这里使用的复制算法进行GC),
  • 最后清理掉Eden和刚才用过的Survivor(From)空间。现在from和to互换了。
  • 将此时在Survivor空间存活下来的对象的年龄设置为1,以后这些对象每在Survivor区熬过一次GC,它们的年龄就加1,当对象年龄达到某个年龄(默认值为15)时,就会把它们移到老年代中。
  • 在新生代中进行GC时,有可能遇到另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象,这些对象将直接通过分配担保机制进入老年代;

判断对象是否存活

  • 引用计数法
    在一个对象被引用时加一,被去除引用时减一,这样我们就可以通过判断引用计数是否为零来判断一个对象是否为垃圾。这种方法我们一般称之为「引用计数法」。主流的Java虚拟机里面都没有选用引用计数算法来管理内存,因为这太浪费时间空间,计数器要好多,还有分配及空间。
  • 可达性分析算法
    通过一系列名为**”GC Roots”**的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不会用的。
  • GC Roots:
    虚拟机栈中引用的对象
    方法区静态属性引用的对象
    方法区常量引用的对象
    JNI引用的对象(Native方法)

垃圾回收算法

1.引用计数法

1.定义:引用指向对象是该对象引用计数器+1,引用结束时-1(如a=null)。如果A计数器为0,则说明该对象可以被回收。
2.特点
优点:

  • 及时回收无效内存,实时性高
  • 垃圾回收过程中无需挂起
  • 没有全局扫描,性能高

缺点:

  • 对象创建时需要更新引用计数器,耗费一部分时间
  • 浪费CPU资源,计数器统计需要实时进行
  • 无法解决循环引用问题,即使对象无效仍不会被回收

2.复制算法

缺点:不会产生空间碎片,但内存折半

  • 复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制 到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。两个幸村区就是因为这个。
  • 如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合
  • 例如:在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。
    紧接着进行GC,在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移 动到年老代中,没有达到阈值的对象会被复制到“To”区域。
    经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新 的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区 域是空的。
    GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

3.标记清除法

标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。
标记:从根节点开始标记引用的对象。
清除:未被标记引用的对象就是垃圾对象,可以被清理。
产生碎片

4.标记压缩算法

标记压缩算法是在标记清除算法的基础之上,做了优化改进的算法。和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的清理未标记的对象,而是将存活的对象压缩到内存的一端,然后 清理边界以外的垃圾,从而解决了碎片化的问题。

5.分代算法

前面介绍了多种回收算法,每一种算法都有自己的优点也有缺点,谁都不能替代谁,所以根据垃圾回收对象的特点 进行选择,才是明智的选择。
分代算法其实就是这样的,根据回收对象的特点进行选择**,在jvm中,年轻代适合使用复制算法,老年代适合使用 标记清除或标记压缩算法。**

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值