jvm:垃圾回收机制知识点

要进行垃圾回收首先要明确哪些需要垃圾回收然后才是怎么回收;

哪些需要垃圾回收

        垃圾回收主要针对的是堆和方法区(虚拟机规范中,方法区不一定要强制进行垃圾回收),所以主要谈堆内存的回收,堆又被分为新生代和老年代,其中新生代又被分为Eden和Survivor(Survicor被分成S1和S2),所知的有两种算法可以进行判断。

        第一,标记计数法;具体实现:给每个对象添加一个引用计数器,当某个地方引用了该对象,则计数器+1,当引用失效,则计数器-1。任何时间只要计数器为0的则是不被引用的对象,该对象就可以回收。这种算法很简单,但是却很难解决相互引用的情况。

        第二,可达性分析法;具体实现:所有对象的起始点为“GC Roots”,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到“GC Roots”没有任何引用链则证明此对象已可以回收。java中可以作为GC Roots的对象:(1)栈中的引用的对象(2)方法区中静态属性引用的对象(3)方法区中常量引用的对象(4)本地方法栈中Native方法引用的对象

垃圾回收算法

        1、标记清除算法:正如其名,先标记出所有要回收的对象然后统一对标记的对象做清除。这种算法的不足表现在效率和空间,效率来讲标记、清除两个过程效率都不高;空间来说,标记清除算法只是将可以回收的对象从内存中清除,这就造成了内存的不连续,如果后续有较大对象需要分配内存,则会提前触发一次垃圾回收

        2、复制算法:复制算法是为了解决效率而产生的,复制算法主要将内存分为两个区(例如A、B),每次只用其中一块(例如A),如果这块内存不足了,就会将这块内存(A)上还存活的对象整个复制到另一块内存(B)中,然后再把(A)的内存上的对象整个清理掉。这种算法的好处是不会产生内存碎片,缺点是内存浪费,因为总会有一块内存无法被使用,并且如果对象存活率比较高的情况下因为要复制大量对象这种算法的效率也是很低的。因此商用虚拟机对新生代的回收基本都是采用复制算法,但是实践表名如果将新生代划分为1:1的比例是不科学的,最终的优化结果就形成了开篇说的新生代被分为Eden和S1、S2比例默认8:1:1,每次仅使用Eden和其中的一块Survivor,垃圾回收时将Eden和Survivor中还存活的对象一次性的复制到另一块Survivor空间上(如果该Survivor空间不够使会让老年代分配担保),最后清理调Eden和刚才用过的Survivor。

        3、标记整理算法:因为复制算法有存活率高效率低的问题,所以这种算法不适用于老年代,因为老年代都是不易被回收的对象。于是有人提出了标记整理算法,和标记清除差不多,但是标记整理算法不是直接对可回收的对象直接清理而是让存活的对象都移向另一端,然后清理调边界意外的内存空间。

以上是三种基本的回收算法,现代商用虚拟机为了效率都会根据不同区域对象存活的情况采用分代收集算法来进行回收,分代收集算法就是将几种算法进行了一个分配,比如大量对象死去,少量存活的新生代采用复制,对象存活率高的用标记清除或者标记整理。

垃圾收集器

    1、Serial收集器

        采用复制算法的单线程的收集器,单线程一方面意味着它只会使用一个CPU或一条线程去完成垃圾收集工作,另一方面也意味着它进行垃圾收集时必须暂停其他线程的所有工作,直到它收集结束为止。后者意味着,在用户不可见的情况下要把用户正常工作的线程全部停掉,这对很多应用是难以接受的。不过实际上到目前为止,Serial收集器依然是虚拟机运行在Client模式下的默认新生代收集器

    2、Serial Old收集器

        serial收集器的老年代版本,使用标记整理算法,主要用于client模式下的虚拟机

    3、PartNew收集器

        PartNew其实是serial收集器的多线程版本,是server模式下虚拟机首选的新生代收集器。只有serial和partNew收集器可以与CMS收集器搭配使用。

    4、Parallel收集器

        新生代的收集器,采用复制算法的并行多线程收集器。特点是:注重吞吐量

    5、Parallel old收集器

        parallel old收集器是parallel的老年代版本,采用标记整理算法。同样这个收集器注重的也是吞吐量,在注重吞吐量和cpu资源敏感的场合,优先考虑parallel和parallel old收集器的组合。

    6、CMS收集器

        基于标记清除算法作用于老年代的收集器,实现了垃圾回收线程与用户线程基本同时工作,以获取最短回收停顿为目的,注重服务的响应速度,希望系统停顿时间最短,以达到给用户最好的流畅体验

    7、G1收集器

        其他收集器进行收集的范围都是整个新生代或者老年代,而G1收集器不再是这样,使用G1收集器时,Java堆的内存布局就与其他收集器有很大差别,它将整个Java堆分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region的集合。G1收集器跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也是Garbage-First名称的由来)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高的收集效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值