JVM学习笔记(6)---垃圾收集器

作者: 18587a1108f1 | 来源:发表于2018-09-06 18:05 被阅读3次

    垃圾收集算法 是内存回收的 方法垃圾收集器 则是内存回收的 实现
    收集器没有最好的没有万能的,只有最合适的。

    垃圾收集器
    图中展示了JDK8之后,HotSpot所有虚拟机的收集器:
    • 7种不同分代的收集器:
      新生代收集器: Serial、ParNew、Parallel Scavenge
      老年代收集器: CMS、Serial Old、Parallel Old
      整堆收集器: G1
    • 两个收集器间有连线,表明可以搭配使用

    Minor GC与 Full GC

    Minor GC又称为新生代GC
    因为新生代对象大多朝生夕灭,所以Minor GC发生频繁,回收速度快
    Full GC/Major GC又称为老年代GC
    发生经常会伴随至少依次Minor GC。回收速度慢,比Minor GC慢10倍以上

    Serial收集器

    Serial收集器是最基本、发展历史最悠久的收集器。

    Serial收集器工作流程
    特点:
    • 针对新生代
    • 采用复制算法
    • 单线程收集器,GC时暂停所有其他工作线程Stop The World,“都给我停!”)

    优点: 简单而高效(与其他单线程收集器相比)

    • 对于限定单个CPU的环境来说,Serial收集器没有线程交互(切换)开销,可以获得最高的单线程收集效率
    • 在桌面应用场景下,分配给虚拟机的内存不大,收集几十兆新生代内存可控制在几十毫秒内,停顿可以接受

    缺点: 停顿导致用户体验差
    应用: 是HotSpot在Client模式下的默认的新生代收集器。
    参数:
    +XX:+UseSerialGC:使用串行收集器。

    ParNew收集器

    ParNew收集器是Serial收集器的多线程版本。

    ParNew收集器工作流程
    特点:
    • 针对新生代
    • 采用复制算法
    • 多线程并行
    • 与Serial共有了很多代码,行为、特点和Serial收集器一样

    并行(Parallel)并发(Concurrent)
    并行:多条垃圾收集线程同时工作,用户线程处于等待。如ParNew、Parallel Scavenge、Parallel Old。
    并发:用户线程与垃圾收集线程同时执行(不一定并行,可能交替执行),用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。如CMS、G1。

    应用:
    虚拟机在Server模式下的首选收集器。
    因为除Serial外,只有ParNew收集器可以和CMS配合工作

    因为Parallel Scavenge收集器以及G1收集器没有使用传统GC收集器代码框架,而是独立实现。而CMS与ParNew等其余收集器则共用部分框架代码

    参数:
    "-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器。
    "-XX:+UseParNewGC":强制使用ParNew。
    "-XX:ParallelGCThreads":并行线程数量。

    Parallel Scanvenge收集器

    Parallel Scavenge收集器也被称为 “吞吐量优先” 收集器。

    Parallel Scavenge收集器工作流程

    特点:

    • 针对新生代
    • 采用复制算法
    • 多线程并行
    • GC时目标为达到一个可控制的吞吐量(Throughput)

    吞吐量 = 用户代码运行时间 / ( 用户代码运行时间 + 垃圾收集时间 )
    高吞吐量可以高效利用CPU时间,尽快完成程序运算,主要适合在后台运算而不需要太多交互的任务。

    参数:
    "-XX:MaxGCPauseMillis":设置最大GC停顿时间。数值越小,GC越频繁,吞吐量越小。
    "-XX:GCTimeRatio":设置GC占总时间的比率。默认GC时间权重为1,参数设定用户代码运行时间权重n。吞吐量计算方式为 n / (1 + n)。
    "-XX:UseAdaptiveSizePolicy":动态调节新老生代参数,以提供合适的停顿时间或最大吞吐量。即GC自适应调节策略

    Serial Old收集器

    Serial Old收集器是Serial收集器的老年代版本。

    Serial Old收集器工作流程

    特点:

    • 针对老年代
    • 采用”标记-整理“算法(Mark-Compact)
    • 单线程收集

    应用:
    主要用于Client模式
    Server模式下,JDK1.5之前,用于搭配Parallel Scavenge使用;作为CMS的后备,在并发收集发生Concurrent Mode Failure时使用。

    Parallel Old收集器

    Parallel Old垃圾收集器是Parallel Scavenge收集器的老年代版本。

    Parallel Old收集器工作流程

    特点:

    • 针对老年代
    • 采用”标记-整理“算法(Mark-Compact)
    • 多线程收集

    参数:
    "-XX:+UseParallelOldGC":指定使用Parallel Old收集器
    应用:
    主要用于Server模式多CPU情况。
    JDK1.6之后,接替Serial Old作为Parallel的搭配;在注重吞吐量以及CPU资源敏感的场景,就有了Parallel Scavenge加Parallel Old收集器的"给力"应用组合。

    其他

    又有事烦我了,先写到这,有时间继续。

    相关文章

      网友评论

        本文标题:JVM学习笔记(6)---垃圾收集器

        本文链接:https://www.haomeiwen.com/subject/jvcdwftx.html