JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解

文章目录

  • [1. 查看默认GC](#1. 查看默认GC)
  • [2. Serial GC : 串行回收](#2. Serial GC : 串行回收)
  • [3. ParNew GC:并行回收](#3. ParNew GC:并行回收)
  • [4. Parallel GC:吞吐量优先](#4. Parallel GC:吞吐量优先)

1. 查看默认GC

  • -XX:+PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)
  • 使用命令行指令:jinfo --flag 相关垃圾回收器参数 进程ID
    • jinfo -flag UseParallelGC 10098

2. Serial GC : 串行回收

概述

  • Serial收集器是最基本、历史最悠久的垃圾收集器了。JDK1.3之前回收新生代唯一的选择。
  • Serial收集器作为HotSpot中Client模式下的默认新生代垃圾收集器。
  • Serial 收集器 采用 复制算法、串行回收和"Stop-the-World"机制 的方式执行内存回收。
  • 除了年轻代之外,Serial收集器还提供用于执行老年代垃圾收集的Serial Old收集器。Serial Old 收集器同样也采用了串行回收和"Stop the World"机制,只不过内存回收算法使用的是标记-压缩算法。
    • Serial Old 是运行在 Client 模式下默认的老年代的垃圾回收器
    • Serial Old 在 Server 模式下主要有两个用途:① 与新生代的Parallel Scavenge配合使用 ② 作为老年代CMS收集器的后备垃圾收集方案
  • 这个收集器是一个单线程的收集器,但它的"单线程"的意义并不仅仅说明它只会使用一个 CPU 或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束(Stop The World)。

优势:简单而高效(与其他收集器的单线程比),对于限定单个 CPU 的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

运行在Client模式下的虚拟机是个不错的选择。

在用户的桌面应用场景中,可用内存一般不大(几十MB至一两百MB),可以在较短时间内完成垃圾收集(几十ms至一百多ms),只要不频繁发生,使用串行回收器是可以接受的。

参数

在HotSpot虚拟机中,使用 -XX:+UseSerialGC 参数可以指定年轻代和老年代都使用串行收集器。

等价于 新生代用Serial GC,且老年代用Serial Old GC

小结

这种垃圾收集器大家了解,现在已经不用串行的了。而且在限定单核cpu才可以用。现在都不是单核的了。

对于交互较强的应用而言,这种垃圾收集器是不能接受的。一般在Java web应用程序中是不会采用串行垃圾收集器的。

3. ParNew GC:并行回收

概述

  • 如果说Serial GC是年轻代中的单线程垃圾收集器,那么ParNew收集器则是Serial收集器的多线程版本。

    • Par是Parallel的缩写,New:只能处理的是新生代
  • ParNew 收集器除了采用并行回收的方式执行内存回收外,两款垃圾收集器之间几乎没有任何区别。ParNew收集器在年轻代中同样也是采用复制算法、"Stop-the-World"机制。

  • ParNew 是很多JVM运行在Server模式下新生代的默认垃圾收集器。

  • 对于新生代,回收次数频繁,使用并行方式高效。
  • 对于老年代,回收次数少,使用串行方式节省资源。(CPU并行需要切换线程,串行可以省去切换线程的资源)

参数

在程序中,开发人员可以通过选项 -XX:+UseParNewGC 手动指定使用ParNew收集器执行内存回收任务。它表示年轻代使用并行收集器,不影响老年代。

-XX:ParallelGCThreads 限制线程数量,默认开启和 CPU 数据相同的线程数。

4. Parallel GC:吞吐量优先

概述

  • HotSpot的年轻代中除了拥有ParNew收集器是基于并行回收的以外,Parallel Scavenge收集器同样也采用了复制算法、并行回收和"Stop the World"机制。

  • 那么Parallel收集器的出现是否多此一举?

    • 和ParNew收集器不同,Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优先的垃圾收集器。
    • 自适应调节策略也是Parallel Scavenge与ParNew一个重要区别。
  • 高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。因此,常见在服务器环境中使用。例如,那些执行批量处理、订单处理、工资支付、科学计算的应用程序。

  • Parallel 收集器在JDK1.6时提供了用于执行老年代垃圾收集的Parallel Old收集器,用来代替老年代的Serial Old收集器。

  • Parallel Old 收集器采用了标记-压缩算法,但同样也是基于并行回收和"Stop-the-World"机制。

  • 在程序吞吐量优先的应用场景中, Parallel 收集器和Parallel Old收集器的组合,在Server模式下的内存回收性能很不错。
  • 在Java8中,默认是此垃圾收集器。
相关推荐
小飞猪Jay33 分钟前
C++面试速通宝典——13
jvm·c++·面试
Ray Wang14 小时前
3.JVM
jvm
java6666688881 天前
Java中的对象生命周期管理:从Spring Bean到JVM对象的深度解析
java·jvm·spring
生产队队长1 天前
JVM(HotSpot):字符串常量池(StringTable)
jvm
Yuan_o_1 天前
JVM(Java Virtual Machine) 详解
jvm
派大星-?1 天前
JVM内存回收机制
jvm
G丶AEOM2 天前
Hotspot是什么?
jvm·hotspot
太阳伞下的阿呆2 天前
Java内存布局
jvm·内存对齐·内存布局·压缩指针
Tech Synapse2 天前
Java如何解决同时出库入库订单号自动获取问题
java·jvm·oracle
hiyo5852 天前
C#类的概念
java·jvm·c#