java之GC机制

前言

在了解了jvm的内存模型之后,明白了jvm的运行原理,并且知道了java程序代码在jvm中是如何被执行的。其中对jvm运行时区域中的java堆有了一定的认识,因为它是主要的垃圾回收区域,本篇将会详细的介绍GC的原理以及各种垃圾回收器。至于如何学习GC,我们从三个问题入手即可。
第一个问题:哪些内存需要回收?
第二个问题:什么时候回收?
第三个问题:怎么回收?

哪些内存需要回收?

在java堆中存放了所有java世界的实例对象,垃圾收集器在对堆进行内存回收之前首先要判断这些对象哪些还存活,哪些已经死去(不被任何途径使用的对象),如何判断呢?
1、引用计数算法
给对象中添加一个引用计数器,每当有一个地方引用它,计数器加1;每当有一个引用失效时,计数器减1;当计数器为0时,则说明此对象需要被回收;
缺点:
当对象A被对象B引用,同时对象B也被对象A引用,两个对象相互被引用,但是除此之外再无其他的引用,客观来讲,这2个对象都应该被回收的,但是引用计数算法无能为力,因此提出了可达性分析算法。
2、可达性分析算法
通过一系列的GC Roots作为根节点,向下搜索,搜索走过的路径成为引用链,如果一个对象到GC Roots没有任何引用链,则说明此对象到根节点不可达,可以判定这个对象是不可用的。【2次标记才会被回收,第二次标记在F-Queue中】
可以作为GC Roots的对象包括下面几种:
a、虚拟机栈中引用的对象
b、方法区中的静态属性引用的对象
c、方法区中常量引用的对象
d、本地方法栈中的native应用的对象

这个地方要明白引用的等级:
强引用:通过new出来的对象实例都是强引用,只要强引用还在,垃圾收集器永远不会回收掉被引用的对象
软引用:描述有用但是非必须的对象引用,在将要发生内存溢出之前,会对这种引用的对象进行二次回收,如果回收之后还是内存不够,才会OOM。
弱引用:这种引用的对象只能存活到收集器下次回收之前,收集器工作时,无论内存够不够用,都回收。
虚引用:无法通过这种引用来获取实例,唯一目的就是能够在这个对象将要被回收的时候收到一个系统通知。

什么时候回收?

1、程序调用System.gc()时触发
2、系统自身来决定GC时间,根据Eden区和From Space区的内存大小来决定,当内存大小不足时,则会启动GC线程并停止应用线程。

GC又分为minor GC和full GC
minor GC的触发条件:当Eden内存满时触发。
full GC触发条件:调用System.gc时;老年代空间不足;方法区空间不足;通过minor GC后进入老年代的平均内存大小大于老年代内存。

怎么回收?

1、标记-清除算法
最基础的算法,之后的算法迭代都是根据这个算法作依据的;遍历所有的对象,通过之前的可达性分析算法作标记,然后统一回收所有被标记的对象。
缺点:递归全堆的对象,效率低下;回收后不整理空间,造成空间碎片化
优点:不移动对象位置。

2、复制算法
将内存区域分为大小相同的两部分,每次只使用其中的一部分,使用完之后,将存活的对象复制到另一块区域,来回切换使用。
缺点:内存变为了原来的一半,代价太高。

3、标记-整理算法
标记与标记-清除算法中的一样,让所有存活的对象向一端移动,然后直接清理掉边界以外的内存。

4、分代收集算法
根据对象存活的周期分为几块,java堆分为老年代和新生代,其比例是新生代:老年代=1:2;然后根据每个年代的特点进行垃圾收集,新生代分为Eden、survival1和survial2其比例是8:1:1;由于新生代对象存活率普遍较低,当eden区内存不足时,将存活的复制到s1区,死亡的清理掉;当eden、s1区的内存都不足时,将2个区域存活的对象复制到s2区,每次的复制都记录复制的次数,当次数到达一定的限制则进入老年代。由此可见新生代主要使用复制算法;当新生代内存不足时直接进入老年代,大对象直接进入老年代,老年代主要的GC算法是标记-整理算法。

垃圾收集器介绍

在这里插入图片描述
1、Serial收集器:适用于新生代,采用复制算法的单线程收集器,简单而高效,但是阻塞,GC线程在执行的时候,用户线程处于等待。
2、ParNew收集器:适用于新生代,Serial收集器的多线程版本,CPU中可用线程数多的话还是很好用的。
3、Parallel Scavenge收集器:新生代收集器,采用复制算法,其特点就是控制吞吐量
4、Serial Old收集器:老年代的收集器,使用标记-整理算法
5、Parallel Old收集器:老年代的收集器,使用标记-整理算法,注重于吞吐量
6、CMS收集器:并发收集,最大化的减少停顿时间;基于标记-清除算法实现,会产生内存碎片;对CPIU资源很敏感,当CPU核数为4的时候,收集线程不少于四分之一的cpu资源,当CPU核数小于4时,CMS将会对用户线程的影响很大。
7、G1收集器:并发充分利用多CPU来缩短停顿时间;分代收集独立的管理GC堆;空间整合,采用标记-整理的算法,不产生碎片;降低停顿时间保证吞吐量。

新生代收集器:Serial、ParNew、Parallel Scavenge;
老年代收集器:Serial Old、Parallel Old、CMS;
整堆收集器:G1;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值