链接: 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:+UseParallelOldGCFullGC 采用并行收集,默认禁用。如果设置了 -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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部