首页 > 代码库 > java虚拟机的垃圾回收机制原理

java虚拟机的垃圾回收机制原理

1.常用的算法:

    a.引用计数法:为每一个对象配置一个整形计数器,当有一个引用时,计数器+1,引用失效时,计数器-1.计数器为0,进行垃圾回收

         存在的问题:A对象引用B,B对象引用A.循环引用,无法清除,引起内存泄漏

         java的垃圾回收器没有使用该算法

    b.标记-清除算法

          分标记阶段和清除阶段.

          存在问题:释放后的空间不是连续的.内存分配不连续的空间,工作效率较低

    c.复制算法

        将内存空间分为两块,每次只使用其中一块,垃圾回收时,将正在使用的内存中存活的对象复制到未使用的内存中,然后,清除使用的内存的所有对象.

        分析:可以保证回收后的内存空间没有碎片.当内存中有大量垃圾对象时,复制算法的效率很高,但存在大量存活对象时,效率低下.适用于年轻代

    d.标记-压缩算法

        对标记-清除算法的优化,清除时,将存活的对象压缩到内存的一端,清除边界外的所有空间,避免产生碎片

    e.增量算法

         垃圾回收的过程中,其他线程都会挂起,增量算法的思想是每次回收一小片区域的内存空间,和应用程序交替进行,

          分析:应用程序一次性停顿时间少,但切换浪费时间,停顿次数增加.系统吞吐量下降

    f.分代

        分为年轻代内存空间,老年代内存,年轻代使用复制算法,老年代使用标记-压缩算法

 

JVM中的垃圾回收器分类

      1.新生代串行收集器:单线程,独占式.使用复制算法.新生代分为 eden 空间、from 空间、to 空间 3 个部分。其中 from 空间和 to 空间可以视为用于复制的两块大小相同、地位相等,且可进行角色互换的空间块。from 和 to 空间也称为 survivor 空间,即幸存者空间,用于存放未被回收的对象。

      2.老年代串行收集器:单线程,独占式.使用标记压缩算法

      3.并行收集器:工作在新生代的垃圾回收 多线程,独占.可以指定线程个数

      4.新生代并行回收收集器:和新生代并行收集器的区别:注重系统吞吐量,可设置最大停顿时间和吞吐量大小

      5.老年代并行回收收集器:多线程.使用标记-压缩算法.

      6.CMS收集器:标记-清除算法.不是独占式的.垃圾回收过程中可以运行程序.关注系统停顿时间.可以设置内存整理的时机

      7.G1收集器:作为一款服务器的垃圾收集器,因此,它在吞吐量和停顿控制上,预期要优于 CMS 收集器。使用标记-压缩算法.可以控制停顿时间

 

 

总结:

      

  GC 相关参数总结

    1. 与串行回收器相关的参数

    -XX:+UseSerialGC:在新生代和老年代使用串行回收器。

    -XX:+SuivivorRatio:设置 eden 区大小和 survivor 区大小的比例。

    -XX:+PretenureSizeThreshold:设置大对象直接进入老年代的阈值。当对象的大小超过这个值时,将直接在老年代分配。

    -XX:MaxTenuringThreshold:设置对象进入老年代的年龄的最大值。每一次 Minor GC 后,对象年龄就加 1。任    何大于这个年龄的对象,一定会进入老年代。

    2. 与并行 GC 相关的参数  

    -XX:+UseParNewGC: 在新生代使用并行收集器。

    -XX:+UseParallelOldGC: 老年代使用并行回收收集器。

    -XX:ParallelGCThreads:设置用于垃圾回收的线程数。通常情况下可以和 CPU 数量相等。但在 CPU 数量比较多的情况下,设置相对较小的数值也是合理的。

    -XX:MaxGCPauseMills:设置最大垃圾收集停顿时间。它的值是一个大于 0 的整数。收集器在工作时,会调整 Java 堆大小或者其他一些参数,尽可能地把停顿时间控制在 MaxGCPauseMills 以内。

    -XX:GCTimeRatio:设置吞吐量大小,它的值是一个 0-100 之间的整数。假设 GCTimeRatio 的值为 n,那么系统将花费不超过 1/(1+n) 的时间用于垃圾收集。

    -XX:+UseAdaptiveSizePolicy:打开自适应 GC 策略。在这种模式下,新生代的大小,eden 和 survivor 的比例、晋升老年代的对象年龄等参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。

    3. 与 CMS 回收器相关的参数

    -XX:+UseConcMarkSweepGC: 新生代使用并行收集器,老年代使用 CMS+串行收集器。

    -XX:+ParallelCMSThreads: 设定 CMS 的线程数量。

    -XX:+CMSInitiatingOccupancyFraction:设置 CMS 收集器在老年代空间被使用多少后触发,默认为 68%。

    -XX:+UseFullGCsBeforeCompaction:设定进行多少次 CMS 垃圾回收后,进行一次内存压缩。

    -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收。

    -XX:+CMSParallelRemarkEndable:启用并行重标记。

    -XX:CMSInitatingPermOccupancyFraction:当永久区占用率达到这一百分比后,启动 CMS 回收 (前提是      -XX:+CMSClassUnloadingEnabled 激活了)。

    -XX:UseCMSInitatingOccupancyOnly:表示只在到达阈值的时候,才进行 CMS 回收。

    -XX:+CMSIncrementalMode:使用增量模式,比较适合单 CPU。

    4. 与 G1 回收器相关的参数

    -XX:+UseG1GC:使用 G1 回收器。

    -XX:+UnlockExperimentalVMOptions:允许使用实验性参数。

    -XX:+MaxGCPauseMills:设置最大垃圾收集停顿时间。

    -XX:+GCPauseIntervalMills:设置停顿间隔时间。

    5. 其他参数

    -XX:+DisableExplicitGC: 禁用显示 GC。

 

优化都是根据自己程序的设计.没有固定的优化方案

 

java虚拟机的垃圾回收机制原理