垃圾回收器分类
Serial: 串行垃圾回收器。
ParNew: 就是 Serial 收集器的多线程版本。
Parallel Scavenge: 类似于 ParNew,也叫吞吐量垃圾回收器,可通过参数设置停顿时间。
Parallel Old: 是 Parallel Scavenge 收集器的老年代版本。
CMS(Concurrent Mark Sweep)收集器:: 获取最短回收停顿时间为目标的收集器。
G1:
JDK8默认垃圾回收器
查看命令: java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=266519360 # 初始堆大小
-XX:MaxHeapSize=4264309760 # 最大堆大小
-XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers
-XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC # 默认使用Parallel垃圾收集器
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
UseParallelGC: 即 Parallel Scavenge + Parallel Old 收集器组合。
查看详细信息: java -XX:+PrintGCDetails -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
Heap
PSYoungGen total 76288K, used 2621K [0x000000076b400000, 0x0000000770900000, 0x00000007c0000000)
eden space 65536K, 4% used [0x000000076b400000,0x000000076b68f748,0x000000076f400000)
from space 10752K, 0% used [0x000000076fe80000,0x000000076fe80000,0x0000000770900000)
to space 10752K, 0% used [0x000000076f400000,0x000000076f400000,0x000000076fe80000)
ParOldGen total 175104K, used 0K [0x00000006c1c00000, 0x00000006cc700000, 0x000000076b400000)
object space 175104K, 0% used [0x00000006c1c00000,0x00000006c1c00000,0x00000006cc700000)
Metaspace used 2352K, capacity 4480K, committed 4480K, reserved 1056768K
class space used 254K, capacity 384K, committed 384K, reserved 1048576K
PSYoungGen 表示的是由 Parallel Scavenge
垃圾收集器管理的新生代;
ParOldGen 表示由 Parallel Old
管理的老年代。
Parallel Scavenge 垃圾收集器
Parallel Scavenge 收集器是一个新生代收集器,采用复制算法,并且是多线程收集器;
Parallel Scavenge 收集器也经常称为吞吐量优先
收集器;
Parallel Scavenge 收集器还有一个参数-XX:+UseAdaptiveSizePolicy
,这是一个开关参数,当这个参数打开之后,就不需要手工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurivivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量
,这种调节方式称为GC自适应的调节策略(GC Ergonomics)。
假设对收集器运作原理不太了解,只需要把基本的内存数据设置好(如 -Xmx设置最大堆
),然后使用MaxGCPauseMillis
参数(更关注最大停顿时间)或者GCTimeRatio
(更关注吞吐量)参数给虚拟机设立一个优化目标,那具体细节参数的调节工作就由虚拟机完成了。
Parallel Old 垃圾收集器
Parallel Old 收集器是Parallel Scavenge 收集器的老年代版本,使用多线程和“标记-整理”算法。
ParNew 垃圾收集器
ParNew垃圾收集器是工作在年轻代上的,只是将串行的垃圾收集器改为了并行。
通过-XX:+UseParNewGC
参数设置年轻代使用ParNew回收器,老年代使用的依然是串行收集器。
ParallelGC 垃圾收集器
ParallelGC收集器工作机制和ParNewGC收集器一样,只是新增了两个和系统吞吐量相关的参数。提高了灵活性。
复制算法
复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。
标记清除法
标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。
标记:从根节点开始标记引用的对象。
清除:未被标记引用的对象就是垃圾对象,可以被清理。
可达性分析算法
将 GC Roots 对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未被找打的对象标记为垃圾对象。
哪些对象可以作为 GC Roots 对象:
- 线程栈上的局部引用变量
- 方法区中类静态属性引用对象
- 方法区中常量引用的对象(final 的常量值)
- 本地方法栈的变量