JVM深入学习(十九)-进入历史的三种垃圾回收器

简介: 学习了解Serial/ParNew/Parallel三种垃圾回收器的知识

1. Serial垃圾回收器

1.1 概述

上文中已经提到过Serial垃圾回收器是最早期的垃圾回收器,是单线程的

Serial垃圾回收器主要针对新生代的回收,回收算法使用复制算法,单线程就是串行回收,具有STW机制

同时Serial也提供了针对老年代的Serial Old垃圾回收器,同样是单线程的,回收算法使用标记-压缩算法,同样具有STW机制.

对于Serial Old

  1. 当jvm是client模式的时候,Serial Old是默认的老年代垃圾回收器.
  2. 当jvm是server模式的时候,Serial Old就主要起到一个后备作用,作为CMS回收失败时的后备方案使用; 同时也可以与Parallel Scavenge配合使用.

1.2 优点:

  1. 把所有垃圾回收器在单线程的表现拿出来对比的时候,Serial的表现是最好的,因为他本身就是在单线程运行的垃圾回收器,无需考虑线程交互的开销.
  2. 在内存不大的情况下,比如几百兆,使用Serial的效果也很好,因为内存不大,回收不是很频繁的情况下,垃圾回收效率也很高.

1.3 指定Serial垃圾回收器

当前高版本jdk默认垃圾回收器已经不是Serial回收器,如何设置使用Serial回收器呢

使用jvm参数

-xx:+UseSerialGC

使用此参数含义: 新生代使用Serial垃圾回收器,老年代使用Serial Old垃圾回收器

例:

看到结果,已经不是G1而是Serial了

使用jinfo验证:



2. ParNew垃圾回收器

2.1 概述

ParNew垃圾回收器是对Serial在多线程下的补充,只针对新生代的回收.

由于现在cpu基本都是多核的情况,所以基本上用不到Serial回收器,ParNew就是多线程版本的Serial,回收算法也与Serial一样使用复制算法,也存在STW.

ParNew可以并行执行垃圾回收线程,加快垃圾回收效率

注: 该垃圾回收器在jdk9中已经被移除.

2.2 优点

相较于Serial来说,多线程版本就是提高了垃圾回收效率,降低了延迟(STW)

当然也不是绝对的,也带分环境来说

在多核cpu环境下,当然是ParNew更加高效,但是在单核cpu下,并没有Serial表现好.

2.3 指定ParNew垃圾回收器

-XX:+UseParNewGC

使用此jvm参数启用ParNew垃圾回收器,注意:此垃圾回收器只针对新生代,不影响老年代垃圾回收器

例:

jdk9之后已经移除该垃圾回收器,因此我换为jdk8测试.

运行结果:

jinfo验证

此时的老年代回收器应该还是Serial Old,也可以切换为CMS

# 执行并发执行的线程数量

-XX:ParallelGCThreads

并发线程数默认为与cpu核数保持一致,也可以通过上述参数修改并发线程数,但是不要超过cpu核数,一般不用修改.

3. Parallel垃圾回收器

3.1 概述

Parallel Scavenge是jdk1.4出现的新的垃圾回收器,针对新生代回收,他的目的是基于吞吐量优先.

Parallel Old是jdk1.6出现的针对老年代回收的垃圾回收器

吞吐量优先就是尽可能的完成运算任务,而不是追求低延迟.

Parallel Scavenge针对新生代回收,基于复制算法,并行回收,STW机制

Parallel Old针对老年代回收,基于标记压缩算法,并行回收,STW机制,在Parallel Old出现之前(jdk1.4-jdk1.5),Parallel只能和Serial Old配合,即针对新生代并行回收,针对老年代只能串行回收,降低了垃圾回收的效率,也不符合Parallel基于吞吐量优先的思想

这么一看其实跟ParNew是一样的,都是基于复制算法,并行回收,那么区别在哪里?

区别:

  1. Parallel Scavenge基于吞吐量,ParNew 只关注并发回收.
  2. Parallel Scavenge 在1.6之后与Parallel old能够配合,Parallel old也是并行回收

同时,Parallel也是jdk1.8的默认垃圾回收器

在Server模式下,Parallel Scavenge+Parallel Old的性能表现非常不错.

3.2 优点

Parallel Scavenge+ Parallel Old都是并行进行垃圾处理的,提升了垃圾处理的效率

同时基于吞吐量优先(程序运行时间尽可能长)的思想能够保证后台尽可能的完成运算.

自适应调节策略: Parallel会自动调节堆空间的大小,新生代/老年代的比例等参数,以达到吞吐量/停顿时间/垃圾回收时间的平衡点.

3.3 Parallel垃圾回收器相关jvm参数

jdk1.8无需指定,默认就是Parallel回收器

3.3.1 指定使用Parallel垃圾回收器

如果在jdk9以后想使用parallel垃圾回收器怎么指定

使用jvm参数

# 启用新生代Parallel Scavenge

-XX:+UseParallelGC

# 启用老年代Parallel Old

-XX:+UseParallelOldGC

此两个参数任选一个都会使用Parallel Scavenge+ Parallel Old

因为根据gc的组合关系来看, jdk8之后Parallel的组合关系只有 Parallel Scavenge+ Parallel Old

3.3.2 指定Parallel线程数

# 指定线程数

-XX:ParallelThreads=[]

与ParNew类似的,默认与cpu核数保持一致

特殊的: 当cpu核数低于8时,默认与cpu核数保持一致,当cpu核数大于8时,不会保持一致,而是根据公式计算:

公式: 3+[5*cpu/8]

个人理解: 这样的原因是在jdk早期版本,cpu还没有这么多核,所以不用考虑核数过多的情况

而在当前的时代,cpu的核数过多其实并不会特别的提高jvm的性能,毕竟线程的切换也是需要开销的,所以能满足jvm的性能需求就可以,因此超过8核就通过公式计算

3.3.3 指定停顿时间和垃圾回收时间

# 指定最大停顿时间

-XX:MaxGCPauseMillis


# 指定垃圾回收时间(占比)

-XX:GCTimeRatio

这两个参数其实就是调整我们性能指标里的最大停顿时间和垃圾回收时间

注意: 这两个参数是成反比的,一个参数调小另外一个参数就会变大

例: 当停顿时间调小时,jvm为了完成停顿时间的指标,就会修改堆内存的分配大小,从底层说,当堆内存变小时,垃圾回收的频率变高,停顿时间就会变小,但是随着垃圾回收的频率变高,垃圾回收时间也会增加.

所以: 慎用-XX:MaxGCPauseMillis参数

3.3.4 开启/关闭自适应策略

Parallel默认开启自适应策略,会自动调节堆空间的大小,新生代老年代的比例,eden/s0/s1的比例等参数以达到吞吐量/停顿时间/垃圾回收时间的平衡点.

堆空间新生代的eden/s0/s1的占比应该是8:1:1,在自适应调节下变成了6:1:1

我们可以通过参数开启/关闭该参数

-XX:+UseAdaptiveSizePolicy

关闭后不会自动调节,需要手动调节

在确定可以手动调优的环境下,可以关闭该参数,使用自定义调优参数.

目录
相关文章
|
5月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
490 55
|
10月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
243 27
|
11月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
5月前
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
157 0
|
5月前
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
110 0
|
7月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
11月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
238 28
|
10月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
10月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
11月前
|
监控 算法 Java
Java虚拟机垃圾回收机制深度剖析与优化策略####
【10月更文挑战第21天】 本文旨在深入探讨Java虚拟机(JVM)中的垃圾回收机制,揭示其工作原理、常见算法及参数调优技巧。通过案例分析,展示如何根据应用特性调整GC策略,以提升Java应用的性能和稳定性,为开发者提供实战中的优化指南。 ####
139 5