你的位置:首页 > 软件开发 > Java > JVM学习(4)——全面总结Java的GC算法和回收机制

JVM学习(4)——全面总结Java的GC算法和回收机制

发布时间:2016-02-28 17:00:21
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置Java堆的分配参数-Xmx 和 –Xms 应该保持一个什么关系,可以让系统的性能尽可能的好呢 ...

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下:

  •  一些JVM的跟踪参数的设置
  • Java堆的分配参数
  • -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的性能尽可能的好呢?是不是虚拟机内存越大越好?

  • Java 7之前和Java 8的堆内存结构
  • Java栈的分配参数
  • GC算法思想介绍–GC ROOT可达性算法  分为了eden伊甸园,两个幸存代survivor,前三者也叫年轻代,其次是老年代old和永久代permanent。一个Java对象被创建,先是存在于eden,如果存活时间超过了两个幸存代就转移到老年代保存,而永久带保存了对象的方法,变量等元数据,如果永久带没地方了就会发生内存泄漏异常错误OutOfMemeoryError:PermGen。  永久区分配参数  栈大小分配 -Xss但是也得预防很深的函数调用可能导致栈内存溢出问题,比如不合适的递归调用。  对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,则对象A就不可能再被使用。就可以回收了。如图有一个根对象,和一个可达的对象:  Java为什么不用他呢,因为引用计数法有很多缺点:对象1没办法回收,但是确实没有用了。 
    • 可触及的–从GC ROOT这个根节点对象,沿着引用的链条,可以触及到这个对象,该对象就叫可触及的,也就是之前说的可达性算法的思想。
    • 可复活的–一旦所有引用被释放,就是可复活状态,因为在finalize()中可能复活该对象(finalize方法只会调用一次)。
    • 不可触及的–在finalize()后,可能会进入不可触及状态,不可触及的对象不可能复活,就可以回收了。
      引出一个方法的理解:finalize方法  上面提到了GC或者执行finalize可能造成程序暂停,这引出一个概念:Stop-The-World现象。  这是Java中一种全局暂停的现象,全局停顿,所有Java代码停止,类似JVM挂起的状态……但是native代码可以执行,但不能和JVM交互。这多半由于GC引起,其他的引起原因比如:  JVM学习(4)——全面总结Java的GC算法和回收机制

      注意:新生代的多线程回收不一定快!看在多核还是单核,和具体环境。、

    • 还有一种是Parallel收集器,它类似ParNew,但是更加关注JVM的吞吐量!同样是在新生代复制算法,老年代使用标记压缩算法,可以使用JVM参数XX:+UseParallelGC设置使用Parallel并行收集器+ 老年代串行,或者使用XX:+UseParallelOldGC,使用Parallel并行收集器+ 并行老年代。也就是说,Parallel收集器可以同时让新生代和老年代都并行收集。如图:

    JVM学习(4)——全面总结Java的GC算法和回收机制

      关于并行收集器还有两个参数设置:

      

      最后看一个很重要的收集器-CMS(并发标记清除收集器Concurrent Mark Sweep)收集器

      顾名思义,它在老年代使用的是标记清除算法,而不是标记压缩算法,也就是说CMS是老年代收集器(新生代使用ParNew),所谓并发标记清除就是CMS与用户线程一起执行。标记-清除算法与标记-压缩相比,并发阶段会降低吞吐量,使用参数-XX:+UseConcMarkSweepGC打开。

       CMS运行过程比较复杂,着重实现了标记的过程,可分为:

    • 初始标记,标记GC ROOT 根可以直接关联到的对象(会产生全局停顿),但是初始标记速度快。
    • 并发标记(和用户线程一起),主要的标记过程,标记了系统的全部的对象(不论垃圾不垃圾)。
    • 重新标记,由于并发标记时,用户线程依然运行(可能产生新的对象),因此在正式清理前,再做一次修正,会产生全局停顿
    • 并发清除(和用户线程一起),基于标记结果,直接清理对象。这也是为什么使用标记清除算法的原因,因为清理对象的时候用户线程还能执行!标记压缩算法的压缩过程涉及到内存块移动,这样会有冲突。
    • 并发重置,为下一次GC做准备工作。

     JVM学习(4)——全面总结Java的GC算法和回收机制

      CMS的特点可以使用-XX:+CMSFullGCsBeforeCompaction,设置进行几次Full GC后,进行一次碎片整理。

       从三个方面考虑:

    • 软件如何设计架构
    • 代码如何写
    • 堆空间如何分配

     


     

    海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

    原标题:JVM学习(4)——全面总结Java的GC算法和回收机制

    关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。