Java 杂谈JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

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

2018-09-06  本文已影响3人  18587a1108f1

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

垃圾收集器
图中展示了JDK8之后,HotSpot所有虚拟机的收集器:

Minor GC与 Full GC

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

Serial收集器

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

Serial收集器工作流程
特点:

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

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

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

ParNew收集器

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

ParNew收集器工作流程
特点:

并行(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收集器工作流程

特点:

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

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

Serial Old收集器

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

Serial Old收集器工作流程

特点:

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

Parallel Old收集器

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

Parallel Old收集器工作流程

特点:

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

其他

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

上一篇下一篇

猜你喜欢

热点阅读