JVM垃圾收集器

 1、什么是垃圾

    没有任何引用指向的一个对象或者多个对象 循环引用

2、哪些是根对象

    1、main方法开始的线程栈帧中的变量
    2、静态变量能访问到的对象
    3、常量池
    4、JNI调用c++写的本地方法栈用的类或者对象

3、垃圾回收算法

    1、标记清除

        优点:算法简单、适用存活对象比较多(即不适合Eden区)
        缺点:两遍扫描效率偏低(第一次找出存活的对象 第二次找出无用的对象再清理) ,容易产生碎片

    2、复制算法

        优点:只扫描一次效率较高没有内存碎片 -  适用于对象存活较少(适合Eden区)的情况
        缺点:对象需要移动(引用的地址需要修改) 、浪费空间

    3、  标记压缩

        优点: 不会产生碎片 方便对象分配  不会产生内存减半
        缺点: 对象需要移动(引用的地址需要修改) 、两遍扫描效率偏低

4、JVM内存分代模型

    1、部分垃圾回收器使用的模型

            ZGC、Shenandoah不再分代
            G1是逻辑分代,物理不分代

    2、新生代、老年代、永久代(元空间)

             1 )新生代 + 老年代 + 永久代(1.7)Perm Generation/ 元数据区(1.8) Metaspace

                    永久代 元数据 - Class
                    永久代必须指定大小限制 ,元数据可以设置,也可以不设置,无上限(受限于物理内存)
                    字符串常量 1.7 - 永久代,1.8 - 堆
                    MethodArea逻辑概念 - 永久代、元数据

            2)新生代 = Eden + 2个suvivor区

                    YGC回收之后,大多数的对象会被回收,活着的进入s0
                    再次YGC,活着的对象eden + s0 进入 s1 区
                    再次YGC,eden + s1 进入 s0 区
                    年龄足够进入老年代
                    s区装不下进入老年代

              3)老年代

                    老年代满了FGC Full GC
                    应尽量减少FGC

3、Minor GC、Major GC、Full GC、Mixed GC

        1)Minor GC是新生代GC,指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的,所以Minor GC非常频繁,一般回收速度也比较快。(一般采用复制算法回收垃圾)
        2)Major GC是老年代GC,指的是发生在老年代的GC,通常执行Major GC会连着Minor GC一起执行。Major GC的速度要比Minor GC慢的多。(可采用标记清楚法和标记整理法)
        3)Full GC是清理整个堆空间,包括年轻代和老年代
        4)Mixed GC: 清理整个新生代以及部分老年代的GC,只有G1有这个模式

5、垃圾收集器 (常用组合)

      1、 Serial 年轻代(复制算法) + Serial Old 串行回收(标记整理) 

      2、parallel scavenge 年轻代(复制算法) + parallel Old(标记整理) 并行回收  

      3、ParNew 年轻代(复制算法) + CMS的并行回收(标记清除)

        1)初始标记:标记根对象速度非常快。 
        2)并发标记:一般占用80%的垃圾回收时间。
        3)重新标记:标记新产生的垃圾(新产生的垃圾一般不多也很快) 。
        4)并发清理:清理过程中也可能产生垃圾(浮动垃圾需要等待下次GC)。
        CMS 老年代回收是并发的, 垃圾回收和应用程序同时运行,降低STW的时间, CMS是MarkSweep也即标记清除,会产生内存碎片问题,碎片到达一定程度,CMS的老年代分配对象分配不下的时候,使用SerialOld 进行老年代回收此时STW会很长,所以老年代内存过大不适合用CMS

      4、G1                                                                 

        1)初始标记:暂定所有线程STW,记录GC Roots能直接引用的对象,速度很快与CMS的初始标记一样。

        2)并发标记:可以与应用线程一起工作,进行可达分析,与CMS的并发标记一样。

        3)最终标记:暂定所有线程(STW),根据三色标记算法修复一些引用的状态,与CMS的重新标记一样。

        4)筛选回收:筛选回收会对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间(可以通过参数 -XX:MaxGCPauseMillis设置)来回收。
 

  • G1 本质上也是一个分带垃圾回收器,相对 CMS 垃圾回收器,有两个改进:

        1)G1从整体来看是基于“标记-整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。
        2)可以准确的控制停顿时间,在不牺牲吞吐的情况下实现低停顿的垃圾回收。(-XX:MaxGCPauseMillis)

  • G1的垃圾收集分为YoungGC、Mixed GC和Full GC。

        1) Young GC:与之前垃圾收集器的Young GC不同,G1并不是当新生代Eden区满了才进行回收,G1会计算当前Eden区回收大概需要多久的时间,若回收时间远小于参数-XX:MaxGCPauseMills值,那么G1就会增加年轻代的Region(可从老年代或Humongous区划分Region给新生代) 给新对象存放;直到Eden区放满G1计算回收时间接近参数-XX:MaxGCPauseMills值,就会触发Young GC。

        2)Mixed GC:若老年代的堆空间占用达到参数-XX:InitiatingHeapOccupancyPercent设定的值就会触发Mixed GC,回收所有的新生代和部分老年代以及Humongous区。主要使用复制算法,需要把各个Region中存活的对象复制到另一个空闲的Region,如果在复制过程中发现没有足够的Region来存放复制的对象,那么就会触发一次Full GC。

        3)Full GC:停止系统程序,然后采用单线程进行标记整理,这个过程是非常耗时的。

6、常用调优、排查命令及工具

      1、jstack  查看线程信息 (关注:WAITING、BLOCKED、RUNNABLE 等信息)
      2、jstat 查看gc信息 (eg: jstat -gcutil pid 1000)
     
 3、jmap 查看内存使用情况 (eg:jmap - histo pid | head -50) 
      分析工具:jvisualvm、arthas、jconsole


7、三色标记算法

      白色:未被标记的对象
      灰色:自身被标记,成员变量未被标记
      黑色:自身和成员变量都已标记完成

    漏标:

重新标记阶段处理漏标的对象

    CMS:Incremental Update  关注引用增加、修改,将黑色对象A重新标记灰色。

    G1:SATB 关注引用删除,当B到C消失时把这个引用推到GC的堆栈,保证对象C还能被GC扫描到加上RememberSet不需要再扫描查找指向白色对象的引用所以效率比较高。
 

8、JVM常用调优参数

-Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间
-XX:+DisableExplictGC System.gc()不管用 FGC (默认开启)
-XX:+PrintGCDetails  打印GC详细日志
-XX:+PrintHeapAtGC 打印GC堆信息
-XX:+PrintFlagsFinal 查看JVM配置
-XX:MaxTenuringThreshold 分代年龄,最大值15

Parallel常用参数

-XX:SurvivorRatio  Eden区 Survivor 区 比例 (默认 8 : 1 : 1)
-XX:PreTenureSizeThreshold 大对象到底多大直接进入老年代

CMS常用参数

-XX:+UseConcMarkSweepGC 使用CMS垃圾收集器
-XX:ParallelCMSThreads CMS线程数量
-XX:CMSInitiatingOccupancyFraction 使用多少比例的老年代后开始CMS收集,默认是68%(近似值),如果频繁发生SerialOld卡顿,应该调小
-XX:+UseCMSCompactAtFullCollection 在CMS时进行压缩(避免产生内存碎片 但GC响应时间会变长)
-XX:CMSFullGCsBeforeCompaction  多少次CMS之后进行压缩

G1常用参数

-XX:+UseG1GC 使用G1垃圾收集器
-XX:G1NewSizePercent 新生代最小比例,默认为5%
-XX:G1MaxNewSizePercent 新生代最大比例,默认为60%
-XX:+G1HeapRegionSize 分区大小,可选项 1 2 4 8 16 32
-XX:MaxGCPauseMillis  GC的最大暂停时间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值