GC简介和监控调优

news2024/12/23 20:04:16

在这里插入图片描述

GC简介:

GC(Garbage Collection)是java中的垃圾回收机制,是Java与C++/C的主要区别之一,在使用JAVA的时候,一般不需要专门编写内存回收和垃圾清理代 码。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。

什么时候GC?

什么时候发生GC?

什么时候full GC?

什么情况下会发生Full GC?

GC类型:

  • Serial GC:为单核CPU上的桌面应用设计的。使用Serial GC会明显的损耗应用的性能。
    参数-XX:+UseSerialGC
    就是Young区和old区都使用serial 垃圾回收算法,

  • Parallel GC:Parallel GC适用于多核CPU且使用了较大内存空间的场景。Parallel GC又被称为"高吞吐GC(throughput GC)“
    参数-XX:+UseParallelGC
    Young区:使用Parallel scavenge 回收算法
    Old 区:可以使用单线程的或者Parallel 垃圾回收算法,由 -XX:+UseParallelOldGC 来控制

  • Parallel Old GC(Parallel Compacting GC)
    Parallel的GC算法是为老年代设计的。

  • Concurrent Mark & Sweep GC (or “CMS”)
    低延迟GC,适用于所有应用对响应时间要求比较严格的场景。
    与其他GC相比,CMS GC要求更多的内存空间和CPU资源
    CMS GC默认不提供内存压缩
    参数-XX:+UseConcMarkSweepGC
    Young区:可以使用普通的或者parallel 垃圾回收算法,由参数 -XX:+UseParNewGC来控制
    Old 区:只能使用Concurrent Mark Sweep

  • Garbage First (G1) GC
    G1最大的改进在于其性能表现,它比以上任何一种GC都更快速
    参数:-XX:+UseG1GC
    没有young/old区

不同区域用到的算法

在这里插入图片描述

在这里插入图片描述

什么是GC监控?

GC监控 指的是在运行时跟踪JVM运行GC的过程。例如,通过GC监控,我们能找出:

  • 何时新生代的对象会被移动到老年代,有多少对象被移到了老年代。
  • 何时stop-the-world发生以及持续时间。
  • 通过GC监控,能发现JVM是否在有效的运行GC以及是否需要额外的GC调优。基于这些信息,我们可以通过优化应用或者改变GC运行方式(GC调优),从而提高应用性能

如何做GC监控?

jstat: Java Virtual Machine Statistics Monitoring Tool

在使用-gcutil选项时,会输出如下字段的信息。在做GC调优时,尤其要关注YGC, YGCT, FGC, FGCT和GCT的数据变化。

[root@hadoop1012 ~]# jstat -gcutil 1845 3000 100
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023
  0.00 100.00  35.86   6.50  95.92  87.40      1    0.023     0    0.000    0.023

YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)

新生代的GC大概需要平均时间 YGCT/YGC
老生代的GC大概需要平均时间 FGCT/FGC

在监控的里FullGC发生0次(FGC),FullGC所用时间为0ms(FGCT),YGC 1次,所用时间:YGCT为0.023s

当Full GC < 半小时/次且Fulll GC time < 1s,可认为GC工作良好。
•Minor GC执行迅速(50毫秒以内)
•Minor GC执行不频繁(间隔10秒左右一次)
•Full GC执行迅速(1秒以内)
•Full GC执行不频繁(间隔10分钟左右一次)

如不满足,则说明GC有优化的空间,但不是必须,需结合实际业务处理速度来看。
如GC进行优化,则需进行长时间的稳定性测试,同时监控GC的指标来判断GC优化的有效性。

两种监控方式:

在这里插入图片描述

在使用-verbosegc时还可同时指定以下附加选项:

  • -XX:+PrintGCDetails 可以详细了解GC中的变化
  • -XX:+PrintGCTimeStamps 可以了解这些垃圾收集发生的时间,自JVM启动以后以秒计量。
  • -XX:+PrintHeapAtGC 了解堆的更详细的信息
  • -XX:+PrintGCDateStamps(JDK6U4引入的选项) GC发生的时间信息
  • -Xloggc:$CATALINA_BASE/logs/gc.log GC日志产生的路径
  • -XX:+PrintGCApplicationStoppedTime 输出GC造成应用暂停的时间

如果只指定-verbosegc选项,则默认会同时指定-XX:+PrintGCDetails。
另外,-verbosegc的附加选项都可以组合使用。

日志输出格式说明

  • 当有minor GC发生时
[GC [<collector>: 
<starting occupancy1> -> <ending occupancy1>, <pause time1> secs] 
<starting occupancy3> -> <ending occupancy3>, <pause time3> secs]

在这里插入图片描述

  • Full GC输出的例子
[Full GC [Tenured: 3485K->4095K(4096K), 0.1745373 secs] 61244K->7418K(63104K), [Perm : 10756K->10756K(12288K)], 0.1762129 secs] [Times: user=0.19 sys=0.00, real=0.19 secs]

推荐JVM的选项

在这里插入图片描述
先监控GC状态
后分析监控数据并决定是否需要GC调优

参考博文:https://segmentfault.com/a/1190000004369016?utm_source=sf-backlinks

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThreadLoca基本使用以及与synchronized的区别

文章目录1. ThreadLocal介绍1.1 官方介绍1.2 基本使用1.2.1 常用方法1.2.2 使用案例1.3 ThreadLocal类与synchronized关键字1.3.1 synchronized同步方式1.3.2 ThreadLocal与synchronized的区别2. 运用场景_事务案例2.1 转账案例2.1.1 场景构建2.1.2 引入事务2.2 常规解决方案2.…

k8s servelList(服务列表) 卡死不同步问题分析

提要容器集群版本情况&#xff1a;k8s 1.20客户端k8s client版本&#xff1a; 0.21事情是这样的&#xff0c;运行了一年的服务&#xff0c;突然有一天业务反馈服务使用异常&#xff0c;然后初步调查结果如下以下截图是网关异常以下截图是客户端zull&#xff08;feign&#xff0…

依赖倒置DIP在系统架构中的应用

最近在对项目中的某一模块进行重构和功能的拓展。一直没想到好方法。 简单理解为&#xff1a; R项目 调用了 E项目的打印接口&#xff0c;但是E项目需要对R传来对数据传输对象DTO进行二次处理&#xff0c;甚至夹杂很多R项目的业务逻辑&#xff08;去调用R项目的接口&#xff0…

代码规范书写说明

目录 一&#xff0c;命名风格 二、常量定义 三、代码格式 一&#xff0c;命名风格 &#xff08;1&#xff09;、不能够以下划线或者美元符号开始&#xff0c;也不能以下划线或者美元符号结束 反例&#xff1a;_name / __name / $name / name_ &#xff08;2&#xff09;、所…

春招进行时:“211文科硕士吐槽工资5500” HR:行情和能力决定价值

学历重要&#xff0c;还是能力重要&#xff1f; 春招进行时&#xff0c;不少学生求职遇冷&#xff0c;会把原因归结为学历水平不够高、毕业院校不够档次、专业不够热门、非一线城市就业机会少等等。 直到上海一位211大学的文科男硕士&#xff0c;吐槽招聘会提供的岗位薪资待遇…

10个实用技巧:如何让你的外贸独立站排名直线上升

在当今竞争激烈的互联网市场中&#xff0c;谷歌SEO已经成为了外贸独立站排名提升的必修课程。为了使得自己的网站能够在谷歌上排名更高&#xff0c;网站优化的工作显得尤为重要。 在这篇文章中&#xff0c;我们将分享10个实用技巧&#xff0c;帮助你的外贸独立站排名直线上升。…

【软件测试】接口测试总结

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…

java虚拟机栈解读

虚拟机栈出现的背景 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功能需要更…

【微信小程序-原生开发】实用教程11 - 用户登录鉴权(含云函数的创建、删除、使用,通过云函数获取用户的openid)

此篇可在实用教程10&#xff08;见下方链接&#xff09;的基础上继续开发&#xff0c;也可以在任何微信小程序中直接使用。 https://blog.csdn.net/weixin_41192489/article/details/128835069 用户登录鉴权逻辑 核心技术&#xff1a;通过云函数获取用户的openid 要想使用云函数…

网络层IP协议与数据链路层以太网协议

文章目录一、IP协议IP地址地址管理路由选择DNS二、以太网协议以太网帧MTU一、IP协议 IP协议是我们网络层的代表协议&#xff0c;今天我们就来一起学习一下吧&#xff0c;我们这里介绍的主要是IPv4协议。 版本&#xff1a;指定IP协议的版本&#xff0c;版本的取值只有4&#x…

如何使用ExchangeFinder在给定域中寻找Microsoft Exchange实例

关于ExchangeFinder ExchangeFinder是一款功能强大且使用简单的开源工具&#xff0c;该工具能够在给定域中尝试搜索指定的Microsoft Exchange实例&#xff0c;该工具的搜索机制基于Microsoft Exchange的常见DNS名称实现&#xff0c;并且能够识别指定的Microsoft Exchange版本&…

java基础之异常总结(自问自答版本)

1.errors和exception的区别是什么&#xff1f; 二者都是JAVA异常处理的重要子类&#xff0c;各自都包含大量子类 区别: exception:程序本身可以处理的异常&#xff0c;可以通过catch来进行捕获&#xff0c;遇到这种错误&#xff0c;应对其进行处理&#xff0c;使应用程序可以继…

大数据技术之Canal入门篇

大数据技术之Canal入门篇 文章目录大数据技术之Canal入门篇写在前面第 1 章 Canal 入门1.1 什么是 Canal1.2 MySQL 的Binlog1.2.1 什么是 Binlog1.2.2 Binlog 的分类1.3 Canal 的工作原理1.3.1 MySQL 主从复制过程1.3.2 Canal 的工作原理1.4 使用场景第 2 章 MySQL 的准备2.1 创…

作为产品经理,你都是怎样思考问题的?

作为产品经理&#xff0c;我们既不是产品的业务员更不是原型画师&#xff0c;而是伟大的创造者。用户对一个产品的评价可能只有好与坏&#xff0c;而作为产品工作者的我们必须有自己思考产品的视角&#xff0c;透过表现洞察本质。笔者根据自己有限的用户研究与产品设计的工作经…

leetcode_回溯算法

回溯算法刷题总结回溯法理论基础回溯算法的模板组合问题77.组合优化版本216.组合总和III17.电话号码的字母组合组合总和组合总和II分割131.分割回文串93.复原IP地址子集78.子集90.子集II491.递增子序列&#xff08;和子集问题很像&#xff09;排列全排列全排列II其他问题332.重…

RK3568平台开发系列讲解(Linux系统篇)伪文件系统目录详细介绍

🚀返回专栏总目录 文章目录 一、procfs文件系统二、sysfs文件系统沉淀、分享、成长,让自己和他人都能有所收获!😄 📢除了专门用于存储设备记录文件的文 件系统外,Linux 内核还提供了procfs、sysfs 等伪文件系统。 伪文件系统存在于内存中,通常不占用硬盘空间,它以文…

QML 键盘事件

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 和鼠标一样,键盘同样也提供了用户交互的能力,所以在介绍完《QML 鼠标事件》之后,是时候深入键盘事件了。 在 QML 中,有一个附加属性 - Keys,是专供可视元素进行按键处理的。当用户按下或释放一个按键时…

DDD:统一语言

目录一、统一语言的作用阐述二、统一语言与领域分析2.1、统一的领域术语2.2、统一的领域行为描述三、统一语言落地执行一、统一语言的作用阐述 【统一语言】&#xff0c;怎么强调都不为过&#xff01;&#xff01; 日常沟通中&#xff0c;时常会出现这么一幕&#xff1a;A同学…

第四章 reactive对象的简单实现以及reactive的依赖收集和触发依赖

reactive对象的简单实现 主要通过reactive.spec.ts这个测试案例来实现功能 import { reactive } from "../reactive"describe(reactive,()>{it(happy path,()>{const original {foo:1}const observed reactive(original)expect(observed).not.toBe(origina…

Unity常见面试题详解(持续更新...)

一丶声明、定义、实例化、初始化 1、首先我们来讨论在C/C中的声明和定义.. 1&#xff09;我们先从函数声明和定义说起... 一般我们在C里都会先定义一个函数&#xff0c;然后再Main函数前将函数声明&#xff0c;比如&#xff1a; //函数声明 int Add(int);int Main {} //函数…