关注微信公众号:CodingTechWork,一起学习进步。

引言

  在我们的日常开发过程中,可能不怎么关注JVM的GC,但是一旦我们开发的程序上线后,伴随着运行时间的拉长,各种线上问题就出现了,比如内存溢出,比如机器cpu和memory耗尽,除了查看程序的日志是否报错抛异常,排查是否有bug,而有时候就得先看看程序运行所需要的内存是否足够。这时,我们就需要GC日志来辅助查看。

GC类型

参数 新生代GC 老年代GC
-XX:+UseSerialGC 虚拟机运行在Client模式的默认值,Serial 串行GC Serial Old串行GC
-XX:+UseParallelGC 虚拟机运行在Server模式的默认值,Parallel Scavenge并行回收GC Parallel Old并行GC
-XX:+UseConcMarkSweepGC ParNew并行GC CMS并发GC,当出现Concurrent Mode Failure时采用Serial Old串行GC作为备用垃圾收集器
-XX:+UseParNewGC ParNew并行GC Serial Old串行GC
-XX:+UseParallelOldGC Parallel Scavenge并行回收GC Parallel Old并行GC
-XX:+UseConcMarkSweepGC
-XX:+UseParaNewGC
Serial串行GC CMS并发GC,当出现Concurrent Mode Failure时采用Serial Old串行GC

jinfo使用

介绍

  jinfo全称Java Configuration info,用于实时查看和调整JVM配置参数。

语法参数

[linux@01 ~]$ jinfo -help
Usage:jinfo [option] <pid>(to connect to running process)jinfo [option] <executable <core>(to connect to a core file)jinfo [option] [server_id@]<remote server IP or hostname>(to connect to remote debug server)where <option> is one of:-flag <name>         to print the value of the named VM flag-flag [+|-]<name>    to enable or disable the named VM flag-flag <name>=<value> to set the named VM flag to the given value-flags               to print VM flags-sysprops            to print Java system properties<no option>          to print both of the above-h | -help           to print this help message

示例

查看JVM运行参数

[linux@01 ~]$ jinfo -flags 15764
Attaching to process ID 15764, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
Non-default VM flags: -XX:CICompilerCount=12 -XX:InitialHeapSize=526385152 -XX:MaxHeapSize=8392802304 -XX:MaxNewSize=2797600768 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=175112192 -XX:OldSize=351272960 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line:  -Djava.util.logging.config.file=/home/s1/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -XX:MaxPermSize=1024m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -agentlib:jdwp=transport=dt_socket,address=8017,server=y,suspend=n -Ds1.conf.dir=/home/s1/conf -Dservice01.logs.dir=/home/s1/logs -Ds1.home.dir=/home/s1-Ds1.server.port=7005 -Ds1.http.port=7010 -Ds1.redirect.port=7443 -Ds1.ajp.port=7009 -Dcas.server.ip=10.x.x.x -Dcas.server.port=7010 -Dbdoc.http.ip=10.x.x.x -Ds1.mysql.address=10.x.x.x:3306 -Ds1.mysql.database.name=db01 -Ds1.mysql.user=s1 -Ds1.mysql.passwd=123456 -Dcatalina.base=/home/s1/tomcat -Dcatalina.home=/home/s1/tomcat -Djava.io.tmpdir=/home/s1/tomcat/temp

查看指定参数是否开启

[linux@01 ~]$ jinfo -flag UseSerialGC 15764
-XX:-UseSerialGC
[linux@01 ~]$
[linux@01 ~]$ jinfo -flag UseParNewGC 15764
-XX:-UseParNewGC
[linux@01 ~]$
[linux@01 ~]$ jinfo -flag UseConcMarkSweepGC 15764
-XX:-UseConcMarkSweepGC
[linux@01 ~]$
[linux@01 ~]$ jinfo -flag UseParallelGC 15764
-XX:+UseParallelGC
[linux@01 ~]$
[linux@01 ~]$ jinfo -flag UseParallelOldGC 15764
-XX:+UseParallelOldGC

查看指定配置参数值

[linux@01 ~]$ jinfo -flag MaxHeapSize 15764
-XX:MaxHeapSize=8392802304

增删配置参数

[linux@01 ~]$ jinfo -flag +PrintGC 17984
[linux@01 ~]$ jinfo -flag PrintGC 17984
-XX:+PrintGC

GC日志

GC日志常用参数

参数 说明
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC详细日志
-XX:+PrintGCDateStamps 以日期的形式输出GC的时间戳,如2021-01-14T20:20:59.125+0800
-XX:+PrintGCTimeStamps 以基准时间的形式输出GC的时间戳
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-XX:+PrintGCApplicationConcurrentTime 打印应用程序执行时间
-XX:+PrintGCApplicationStoppedTime 打印应用程序因GC而产生的停顿时间
-Xloggc:/var/logs/gc.log 以文件的方式保存GC日志

对象优先在Eden分配

  我们先看一下gc的一个分代处理。

Eden分配

  大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间进行分配时,VM将发起一次Minor GC。
  新生代总可用空间:Eden区 + 1个Survivor区的总容量

新生代和老年代GC

新生代GC(Minor GC)和老年代GC(Major GC/ Full GC)

  • 新生代GC:Minor GC指发生在新生代的垃圾收集动作,Java对象大多是朝生夕灭,Minor GC非常频繁,回收速度快。回收新生代,新生代中分为Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor。默认Eden : Survivor=8:1,Survivor不够时,老年代内存分配担保。新生代中,每次垃圾收集时都发现有大批对象死去,少量存活,选用复制算法。
  • 老年代GC:Major GC指发生在老年代的GC,出现此GC,经常会伴随至少一次Minor GC,一般Major GC比Minor GC慢10倍以上。老年代中,对象存活率高、没有额外空间进行分配担保,使用“标记-清理”或者“标记-整理”。

GC日志示例分析

   [Eden: 5888.0M(5888.0M)->0.0B(6592.0M) Survivors: 640.0M->672.0M Heap: 27.4G(32.0G)->21.7G(32.0G)][Times: user=2.55 sys=0.04, real=0.14 secs]
  • Eden: 5888.0M(5888.0M)->0.0B(6592.0M):表示发生GC前,Eden空间大小是5888.0M,且空间全部被占用。发生GC发生之后,年轻代空间(Young Generation)下降到0,Eden空间增长到6592.0M。
  • Survivors: 640.0M->672.0M:表示发生GC前,Survivor存活区空间是640.0M。发生GC后,存活区空间增长到672.0M,表明对象从年轻代(Young Generation)提升到存活区空间(Survivor space)
  • Heap: 27.4G(32.0G)->21.7G(32.0G):表示发生GC前,Heap堆空间大小是32.0G,被占用27.4G。发生GC后,堆大小仍然为32.0G,堆占用了21.7G(即(27.4G-21.7G)的对象被垃圾回收了)。
  • [Times: user=2.55 sys=0.04, real=0.14 secs]
    1)user表示CPU工作在用户态所花费的时间;
    2)sys表示CPU工作在内核态所花费的时间;
    3)real表示GC事件所花费的总时间。
    一般,user+sys就是CPU花费的实际时间。
    a)如果进程工作在多线程的环境下(垃圾回收通过并发执行),一般该值会超过real,即:user + sys > real
    b)如果出现串行的垃圾回收,有可能观察到user + sys = real
    c)如果CPU资源匮乏、I/O操作繁忙,GC就会出现等待的情况,这时会出现user + sys < real

JVM——jinfo命令使用及GC日志分析相关推荐

  1. JVM调优——之CMS GC日志分析

    最近在学习JVM和GC调优,今天总结下CMS的一些特点和要点,让我们先简单的看下整个堆年轻代和年老代的垃圾收集器组合(以下配合java8完美支持,其他版本可能稍有不同),其中标红线的则是我们今天要着重 ...

  2. JVM 调优实战--可视化GC日志分析工具GC Easy使用教程

    设置GC日志输出参数 将GC日志信息生成到文件中: 将会在F://test目录生成gc.log文件: GC Easy可视化工具 导致GC的原因:

  3. 【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )

    文章目录 一.设置 JVM 命令参数输出 GC 日志 二.GC 日志示例 三.GC 日志分析 一.设置 JVM 命令参数输出 GC 日志 在 IntelliJ IDEA 的启动参数中设置 -XX:+P ...

  4. JVM学习笔记-GC日志分析(对象优先在Eden区分配)

    前言 在进行GC日志分析前,先了解一下JVM虚拟机运行时数据区的主要划分: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域 有各自的用途,以及创建和销毁 ...

  5. JVM性能优化之GC日志分析

    JVM性能优化之GC日志分析 文章目录 JVM性能优化之GC日志分析 前言 一.GC日志参数 GC日志参数 常用的垃圾收集器配置 大对象回收 二.GC日志分析工具 GCeasy JVM memory ...

  6. JVM GC日志分析

    常用JVM参数 http://blog.csdn.net/gzh0222/article/details/8223277  分析gc日志后,经常需要调整jvm内存相关参数,常用参数如下 -Xms:初始 ...

  7. GC之七--gc日志分析工具

    性能测试排查定位问题,分析调优过程中,会遇到要分析gc日志,人肉分析gc日志有时比较困难,相关图形化或命令行工具可以有效地帮助辅助分析. Gc日志参数 通过在tomcat启动脚本中添加相关参数生成gc ...

  8. java+jvm+log_java8添加并查看GC日志(ParNew+CMS)

    一.背景 java8的垃圾回收器一般推荐的是parNew+CMS,分别针对新生代和老年代的垃圾回收器.实际生产上,有时需要分析GC日志,检查GC回收有没有引起过多的系统暂停,特别是full GC. 二 ...

  9. java8 GC日志分析

    @[toc] 前言 最近学习分析了一下java8的GC日志,顺便记录下来,忘性太大了 背景: java version "1.8.0_144" Java(TM) SE Runtim ...

最新文章

  1. 将ADS1.2的工程迁移到KEIL上-基于2440
  2. Python通过http、url获取数据
  3. 原来,王兴是理想汽车的「二当家」!股份只比李想少1.6%丨理想汽车招股书
  4. monty python喜剧-经典喜剧电影推荐:巨蟒与圣杯
  5. Elasticsearch 2.20入门篇:基本操作
  6. Python-Matplotlib动态曲线图(linechart)绘制
  7. 大话设计模式—桥接模式
  8. windows编译MaskRCNN
  9. android studio资源二进制,无法自动检测ADB二进制文件 – Android Studio
  10. 查看pem证书的ASN数据结构的方法
  11. 03 ansible核心模块 之 文件类型模块
  12. 学习随笔:Django 补充及常见Web攻击 和 ueditor
  13. lms自适应滤波器matlab_自适应回声消除器简介
  14. python fund_Python fund-my-watcard包_程序模块 - PyPI - Python中文网
  15. oracle 密码过期 ora-01017,Oracle密码过期, 报:ORA-01017: 用户名/口令无效; 登录被拒绝...
  16. 博弈论分析题_“博弈论”习题及参考答案
  17. mysql数据库授权,备份,恢复_wuli大世界_新浪博客
  18. HYGGE 一元函数积分学
  19. ar71xx php-fpm,ar71xx和ar93xx平台所有8M固件!!nwan,aria2,qos,samba,tr,cpulimit-ng,等等...
  20. Fisco技术文档总结1---搭建第一个区块链网络

热门文章

  1. pytorch1.7教程实验——使用 TensorBoard 可视化模型,数据和训练
  2. php中mimes函数,wordpress函数check_upload_mimes()用法示例
  3. AntDesignUI - V3.0 技术手册(资源篇)
  4. 前端框架:AntdUI 文档入门
  5. vue中class绑定函数
  6. vue (可读写)全局变量的 定义、任意调用、值的修改
  7. PC端页面调用QQ聊天 - 封装篇
  8. 精美在线课程教育学习培训平台网站模板源码 HTML纯静态
  9. android的app语言无法切换,Android应用实现多语言切换
  10. mysql命令详细解_mysql命令详解