GC回收垃圾对象过程

GC回收垃圾对象需要完成的三件事

1、哪些内存需要回收?

2、如何判断对象是否该回收?

3、如何回收垃圾对象?

哪些内存需要回收

  程序计数器、虚拟机栈、本地方法栈三个区域随线程而生随线程而灭。虚拟机栈中的栈帧随着方法的开始和结束对应着入栈和出栈。每一个栈帧需分配内存的大小在类结构确定下来时就已知了。因此这几个区域的内存分配和回收都具有确定性。方法结束时或是线程结束时内存会随之回收。

  Java堆和方法区不同,一个接口的实现类所需的内存可能不同,一个方法的不同分支所需内存也可能不同。只有在程序运行期才能知道要创建多少对象,这部分的内存分配和回收具有动态性。

如何判断对象是否该回收

引用计数算法

  给对象添加一个引用计数器,每当有一个地方引用该对象时计数器加1,有一个地方的引用失效时计数器减1,计数器为0的对象判定为不可用。但是主流的虚拟机没有选用该算法原因是无法解决对象之间互相循环引用的问题。

可达性分析算法

  该算法思路是通过一系列称为"GC Roots "的对象作为起始点开始向下搜索,搜索走过的路径称为引用链(Reference Chain)。当一个对象到GC Roots没有任何引用链相连接时则证明此对象不可用。

虽然5、6、7对象互相引用,但是他们到GC Roots是不可达的,他们将被判定为可回收的对象。

可作为GC Roots的对象

  虚拟机栈(栈帧中的本地变量表)中引用的对象

  方法区中静态属性引用的对象

  方法区中常量引用的对象

  本地方法栈(Native方法)中引用的对象

对象引用

强引用

  该引用普遍存在如Object obj = new Object();,只要强引用还存在垃圾收集器将不能回收掉被引用的对象。

软引用

  该引用描述的是还有用但是非必须的对象。对于软引用着的对象在系统发生内存溢出异常之前会回收该对象,如果内存不够才会抛出内存溢出异常。SoftReference类实现软引用。

弱引用

  该引用描述非必须的对象。对于弱引用着的对象只能存活到下一次垃圾收集器触发之前,无论内存是否足够都会回收该对象。WeakReference类实现弱引用。

虚引用

  该引用不会对对象的生存时间产生影响而且我们无法通过该引用获得对象实例。唯一的作用是当对象被回收时收到一个系统通知。PhantomReference类实现虚引用。 

回收方法区

  方法区的垃圾收集行为比较少,主要是收集废弃常量和无用的类。

  废弃常量容易判定,无用的类需满足三个条件才能判定类是无用的

    该类的所有实例已被回收,堆中没有类的任何实例

    加载该类的类加载器已经被回收

    该类的java.lang.Class对象没有在任何地方被引用,在任何地方无法通过反射访问其方法

  在大量使用反射、动态代理的框架、动态生成JSP及OSGI这类频繁自定义ClassLoader的场景都需要虚拟机有类卸载功能保证方法区不会溢出

如何回收垃圾对象 (垃圾收集算法)

标记-清除算法

  首先标记要回收的对象,标记完成后统一回收所有被标记的对象。不足是标记和清除效率都不高,标记清除后产生不连续的空间碎片。

复制算法

  将可用内存划分为大小相等的两块,每次只用其中一块,用完之后将活着的对象复制到另一块上,然后将用过的那块一次性清除。当前虚拟机对新生代都使用该算法,将内存分为一个块较大的Eden和两块较小的Survivor空间,每次使用一块Eden和一块Survivor,回收时将存活的对象复制到另一块Survivor中。当Survivor空间不足时依赖其他内存(老年代)进行分配担保。

标记-整理算法

  标记和标记-清除算法算法一样,接下来不是直接对可回收的对象进行回收,而是让所有的存活对象向一段移动,然后清除掉端边界外的内存。

分代收集算法

  当前虚拟机都采用该算法,将Java堆分为新生代和老年代。新生代中每次GC时都会有大量对象死去,少部分存活选用复制算法。老年代对象存活率较高,没有额外内存进行分配担保必须使用标记-清除或标记-整理算法。

 

转载于:https://www.cnblogs.com/BINGJJFLY/p/7610684.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值