jvm学习笔记(三) ----- 垃圾回收器

链接: jvm学习笔记(一) ----- JAVA 内存
链接: jvm学习笔记(二) ----- 垃圾回收

  1. JVM垃圾回收性能有以下两个主要的指标:

    • 吞吐量 :工作时间(排除GC时间)占总时间的百分比, 工作时间并不仅是程序运行的时间,还包含内存分配时间。
    • 暂停时间: 测试时间段内,由垃圾回收导致的应用程序停止响应次数/时间。
  2. GC操作:

    • minor GC: 在新生代进行的GC
    • major GC: 在老年代进行的GC
    • Full GC : 同时作用于新生代和老年代

1.单线程/串行收集器

Serial + SerialOld

  1. Serial 工作在新生代的单线程收集器,采用『复制算法』,垃圾回收发生时,会暂停所有用户线程

  2. SerialOld 工作在老年代的单线程收集器,采用『标记-整理算法』,垃圾回收发生时,会暂停所有用户线程(stop-the-world)

  3. 配置

-XX:+UseSerialGC
  1. 采用单线程执行所有的垃圾回收工作, 适用于单核CPU服务器,无法利用多核硬件的优势

在这里插入图片描述

2.多线程回收器-吞吐量优先

  1. Parallel Scavenge 工作在新生代的多线程收集器,采用『复制算法』,垃圾回收发生时,会暂停所有用户线程 单核cpu并不能工作地比Serial好,它的特点是一个以吐量优先 的回收器,下面选项打开 Parallel Scavenge + SerialOld。
  2. Parallel Old 工作在老年代的多线程收集器,采用『标记-整理算法』,垃圾回收发生时,会暂停所有用户线程,也是以 吞吐量优先 的回收器,下面选项打开 Parallel Scavenge + Parallel Old。
  3. 配置
-XX:+UseParallelGC
-XX:+UseParallelOldGC

在这里插入图片描述

3. 多线程回收器-响应时间优先

ParNew + SerialOld + CMS

  1. ParNew 工作在新生代的多线程收集器,采用『复制算法』,垃圾回收发生时,会暂停所有用户线程,单核 cpu 并不能工作地比 Serial 好。
  2. CMS(Concurrent Mark Sweep)用在重视响应速度,停顿时间最短的场合。工作在老年代,基于多线程和『标记-清除算法』,特点是在标记和清理的某些阶段不必暂停用户线程。

4.G1收集器

  1. G1(Garbage-First)把整个内存区域划分为大小相等的若干区域(region),分为Eden ,Survivor ,Old ,Humongous 四种类型,G1优先回收其中垃圾最多的区域。它采用的算法是 Mark-Copy 不会产生大量内存碎片,它的优势在于可预测的停顿时间 。
    在这里插入图片描述

  2. 配置

-XX:+UseG1GC

5.GC参数

参数 描述
-XX:+UseSerialGC 启用串行收集器
-XX:+UseParallelGC 启用并行垃圾收集器,配置了该选项,那么 -XX:+UseParallelOldGC默认启用
-XX:+UseParallelOldGC FullGC 采用并行收集,默认禁用。如果设置了 -XX:+UseParallelGC则自动启用
-XX:+UseParNewGC 年轻代采用并行收集器,如果设置了 -XX:+UseConcMarkSweepGC选项,自动启用
-XX:ParallelGCThreads 年轻代及老年代垃圾回收使用的线程数。默认值依赖于JVM使用的CPU个数
-XX:+UseConcMarkSweepGC 对于老年代,启用CMS垃圾收集器。 当并行收集器无法满足应用的延迟需求是,推荐使用CMS或G1收集器。
启用该选项后, -XX:+UseParNewGC 自动启用。
-XX:+UseG1GC 启用G1收集器。 G1是服务器类型的收集器, 用于多核、大内存的机器。它在保持高吞吐量的情况下,高概率满足GC暂停时间的目标。

我们也可以在测试的时候,将JVM参数调整之后,将GC的信息打印出来,便于为我们进行参数调整提供依据,具体参数如下:

选项 描述
-XX:+PrintGC 打印每次GC的信息
-XX:+PrintGCApplicationConcurrentTime 打印最后一次暂停之后所经过的时间, 即响应并发执行的时间
-XX:+PrintGCApplicationStoppedTime 打印GC时应用暂停时间
-XX:+PrintGCDateStamps 打印每次GC的日期戳
-XX:+PrintGCDetails 打印每次GC的详细信息
-XX:+PrintGCTaskTimeStamps 打印每个GC工作线程任务的时间戳
-XX:+PrintGCTimeStamps 打印每次GC的时间戳

如果是在Tomcat中运行 , 需要在bin/catalina.sh的脚本中 , 追加如下配置 :

JAVA_OPTS="-XX:+UseConcMarkSweepGC  -XX:+PrintGCDetails"

window

set JAVA_OPTS=-server  -Xms2048m  -Xmx2048m  -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:SurvivorRatio=8

相关推荐

  1. jvm垃圾回收

    2024-06-11 01:14:08       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 01:14:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 01:14:08       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 01:14:08       82 阅读
  4. Python语言-面向对象

    2024-06-11 01:14:08       91 阅读

热门阅读

  1. 构建SOA架构时应该注意的问题

    2024-06-11 01:14:08       28 阅读
  2. WPF Frame应用 实现页面跳转

    2024-06-11 01:14:08       31 阅读
  3. 中介子方程十一

    2024-06-11 01:14:08       33 阅读
  4. 对象创建的4种模式

    2024-06-11 01:14:08       25 阅读
  5. centos中sudo: apt: command not found

    2024-06-11 01:14:08       31 阅读
  6. k8s-CCE使用node节点使用VIP--hostNetwork&hostPort

    2024-06-11 01:14:08       28 阅读
  7. 2244. 完成所有任务需要的最少轮数

    2024-06-11 01:14:08       34 阅读
  8. debugger(四):源代码

    2024-06-11 01:14:08       25 阅读
  9. 第四章 Three.js 绘制基本几何体

    2024-06-11 01:14:08       23 阅读