JVM 分析GC日志

news2025/2/4 21:48:48

GC日志参数

-verbose:gc

输出gc日志信息,默认输出到标准输出

-XX:+PrintGC

输出GC日志。类似:-verbose:gc

-XX:+PrintGCDetails

在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况

-XX:+PrintGCTimeStamps

输出GC发生时的时间戳

-XX:+PrintGCDateStamps

输出GC发生时的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC

每一次GC前和GC后,都打印堆信息

-Xloggc:<file>

表示把GC日志写入到一个文件中去,而不是打印到标准输出中

GC日志格式

GC日志分类

MinorGC

        MinorGC(或young GC或YGC)日志:

[GC (Allocation Failure) [PSYoungGen: 31744K->2192K(36864K)] 31744K->2200K(121856K), 0.0139308 secs] [Times: user=0.05 sys=0.01, real=0.01 secs] 

FullGC

        Full GC日志介绍:

[Full GC (Metadata GC Threshold) [PSYoungGen: 5104K->0K(132096K)] [ParOldGen: 416K->5453K(50176K)] 5520K->5453K(182272K), [Metaspace: 20637K->20637K(1067008K)], 0.0245883 secs] [Times: user=0.06 sys=0.00, real=0.02 secs] 

GC日志结构剖析

垃圾收集器

  • 使用Serial收集器在新生代的名字是Default New Generation,因此显示的是"[DefNew"
  • 使用ParNew收集器在新生代的名字会变成"[ParNew",意思是"Parallel New Generation"
  • 使用Parallel Scavenge收集器在新生代的名字是"[PSYoungGen",这里的JDK1.7使用的就是PSYoungGen
  • 使用Parallel Old Generation收集器在老年代的名字是"[ParOldGen"
  • 使用G1收集器的话,会显示为"garbage-first heap"

Allocation Failure:表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了

GC前后情况

        我们可以发现GC日志格式的规律一般都是:GC前内存占用—>GC后内存占用(该区域内存总大小)

        [PSYoungGen: 5986K->696K(8704K)] 5986K->704K(9216K)

        中括号内:GC回收前年轻代堆大小,回收后大小,(年轻代堆总大小)

        括号外:GC回收前年轻代和老年代大小,回收后大小,(年轻代和老年代总大小)

GC时间

GC日志中有三个时间:user,sys和real

  • user – 进程执行用户态代码(核心之外)所使用的时间。这是执行此进程所使用的实际 CPU 时间,其他进程和此进程阻塞的时间并不包括在内。在垃圾收集的情况下,表示 GC 线程执行所使用的 CPU 总时间。
  • sys – 进程在内核态消耗的 CPU 时间,即在内核执行系统调用或等待系统事件所使用的 CPU 时间。
  • real – 程序从开始到结束所用的时钟时间。这个时间包括其他进程使用的时间片和进程阻塞的时间(比如等待 I/O 完成)。对于并行gc,这个数字应该接近(用户时间+系统时间)除以垃圾收集器使用的线程数。

        由于多核的原因,一般的GC事件中,real time是小于sys + user time的,因为一般是多个线程并发的去做GC,所以real time是要小于sys+user time的。如果real>sys+user的话,则你的应用可能存在下列问题:IO负载非常重或者是CPU不够用。

Minor GC日志解析

2020-11-20T17:19:43.265-0800: 0.822: [GC (ALLOCATION FAILURE) [PSYOUNGGEN: 76800K->8433K(89600K)] 76800K->8449K(294400K), 0.0088371 SECS] [TIMES: USER=0.02 SYS=0.01, REAL=0.01 SECS] 

2020-11-20T17:19:43.265-0800

        日志打印时间日期格式如2013-05-04T21:53:59.234+0800

0.822

        gc发生时,Java虚拟机启动以来经过的秒数

[GC (ALLOCATION FAILURE)

        发生了一次垃圾回收,这是一次Minor GC。它不区分新生代GC还是老年代GC,括号里的内容是gc发生的原因,这里的Allocation Failure的原因是新生代中没有足够区域能够存放需要分配的数层而失败。

[PSYOUNGGEN: 76800K->8433K(89600K)]

PSYoungGen:表示GC发生的区域,区域名称与使用的GC收集器是密切相关的

  1. Serial收集器:Default New Generation显示DefNew
  2. ParNew收集器:ParNew
  3. Parallel Scanvengel收集器:PSYoung
  4. 老年代和新生代同理,也是和收集器名称相关

76800K->8433K(89600K:GC前该内存区域已使用容量·>GC后该区域容量(该区域总容量)

  1. 如果是新生代,总容量则会显示整个新生代内存的9/10,即eden+from/to区
  2. 如果是老年代,总容量则是全部内存大小,无变化

76800K->8449K(294400K)

        在显示完区域容量GC的情况之后,会接着显示整个堆内存区域的GC情况:GC前堆内存已使用容量·>GC堆内存容量(堆内存总容量)

        堆内存总容量=9/10新生代+老年代<初始化的内存大小

0.0088371 SECS

        整个GC所花费的时间,单位是秒

[TIMES: USER=0.02 SYS=0.01, REAL=0.01 SECS] 

        user:指的是CPU工作在用户态所花费的时间

        sys:指的是CPU工作在内核态所花费的时间

        rea:指的是在此次Gc事件中所花费的总时间

Full GC日志解析

2020-11-20T17:19:43.794-0800: 1.351: [FULL GC (METADATA GC THRESHOLD) [PSYOUNGGEN: 10082K->0K(89600K)] [PAROLDGEN: 32K->9638K(204800K)] 10114K->9638K(294400K),[METASPACE: 20158K->20156K(1067008K)], 0.0285388 SECS] [TIMES: USER=0.11 SYS=0.00, REAL=0.03 SECS] 

2020-11-20T17:19:43.794-0800

        日志打印时间日期格式如2013-05-04T21:53:59.234+0800

1.351

        gc发生时,Java虚拟机启动以来经过的秒数

FULL GC (METADATA GC THRESHOLD)

        发生了一次垃圾回收,这是一次FULL GC。它不区分新生代GC还是老年代GC。括号里的内容是gc发生的原因,这里的Metadata GC Threshold的原因是Metaspacel区不够用了。

        Full GC(Ergonomics):JVM自适应调整导致的GC

        Full GC(System):调用了System.gc()方法

[PSYOUNGGEN: 10082K->0K(89600K)]

        PSYoungGen:表示GC发生的区域,区域名称与使用的GC收集器是密切相关的

  1. Seriall收集器:Default New Generation显示DefNew
  2. ParNewl收集器:ParNew
  3. Parallel Scanvengel收集器:PSYoung
  4. 老年代和新生代同理,也是和收集器名称相关

        10082K->0K(89600K):GC前该内存区域已使用容量 --> GC后该区域容量(该区域总容量)

  1. 如果是新生代,总容量则会显示整个新生代内存的9/10,即eden+from/to区
  2. 如果是老年代,总容量则是全部内存大小,无变化

[PAROLDGEN: 32K->9638K(204800K)]

        老年代区域没有发生GC,因为本次GC是metaspace起的

10114K->9638K(294400K)

        在显示完区域容量GC的情况之后,会接着显示整个堆内存区域的GC情况:GC前堆内存已使用容量 --> GC堆内存容量(堆内存总容量)堆内存总容量=9/10新生代+老年代<初始化的内存大小

[METASPACE: 20158K->20156K(1067008K)]

        metaspace GC回收2K空间

0.0285388 SECS

        整个GC所花费的时间,单位是秒

[TIMES: USER=0.11 SYS=0.00, REAL=0.03 SECS] 

        user:指的是CPU工作在用户态所花费的时间

        sys:指的是CPU工作在内核态所花费的时间

        rea:指的是在此次Gc事件中所花费的总时间

案例演示

代码

/**
 * 在jdk7 和 jdk8中分别执行
 *  * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseSerialGC
 */
public class GCLogTest1 {
    private static final int _1MB = 1024 * 1024;

    public static void testAllocation() {
        byte[] allocation1, allocation2, allocation3, allocation4;
        allocation1 = new byte[2 * _1MB];
        allocation2 = new byte[2 * _1MB];
        allocation3 = new byte[2 * _1MB];
        allocation4 = new byte[4 * _1MB];
    }

    public static void main(String[] agrs) {
        testAllocation();
    }
}

图解

在JDK7中:与jdk8中有所不同

GC日志分析工具

        上节介绍了GC日志的打印及含义,但是GC日志看起来比较麻烦,本节将会介绍一下GC日志可视化分析工具GCeasy和GCviewer等。通过GC日志可视化分析工具,我们可以很方便的看到JVM各个分代的内存使用情况、垃圾回收次数、垃圾回收的原因、垃圾回收占用的时间、吞吐量等,这些指标在我们进行JVM调优的时候是很有用的。

        如果想把GC日志存到文件的话, 是下面这个参数:-Xloggc:/path/to/gc.log 然后就可以用一些工具去分析这些gc日志。

GCeasy

        GCeasy——一款超好用的在线分析GC日志的网站

        官网地址:https://gceasy.io/,GCeasy是一款在线的GC日志分析器,可以通过GC日志分析进行内存泄漏检测、GC暂停原因分析、JVM配置建议优化等功能,而且是可以免费使用的(有一些服务是收费的)。

GCViewer

        GCViewer是一个免费的、开源的分析小工具,用于可视化查看由SUN/Oracle,IBM,HP和BEA Java虚拟机产生的垃圾收集器的日志。

        GCViewer用于可视化Java VM选项-verbose:gc 和.NET生成的数据-Xloggc:<file>。它还计算与垃圾回收相关的性能指标(吞吐量,累积的暂停,最长的暂停等)。当通过更改世代大小或设置初始堆大小来调整特定应用程序的垃圾回收时,此功能非常有用。

1.下载GCViewer工具

        源码下载:https://github.com/chewiebug/GCViewer

        运行版本下载:https://github.com/chewiebug/GCViewer/wiki/Changelog

2.只需双击gcviewer-1.3x.jar或运行java -jar gcviewer-1.3x.jar(它需要运行java 1.8 vm),即可启动GCViewer(gui)

其他工具

GChisto:GChisto是一款专业分析gc日志的工具,可以通过gc日志来分析:MinorGC、Full GC的次数、频率、持续时间等,通过列表、报表、图表等不同形式来反应gc的情况。

HPjmeter:工具很强大,但只能打开由以下参数生成的GC log,verbose:gc-XIoggc:gc.log。添加其他参数生成的gc.log无法打开。HPjmeter集成了以前的HPjtunel功能,可以分析在HP机器上产生的垃圾回收日志文件

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

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

相关文章

【力扣】141和142环形链表

141.环形链表 法一&#xff1a;快慢指针 思路&#xff1a; 用两个指针slow,fast,后者能比前者多走一步路&#xff0c;那判断是不是有环&#xff0c;只需要判断是否会相遇。 就是有一个能比乌龟跑2倍快的兔子&#xff0c;两小只都在有环的路上跑&#xff0c;那是不是肯定会相…

【基于NLP的微博情感分析:从数据爬取到情感洞察】

基于NLP的微博情感分析&#xff1a;从数据爬取到情感洞察 背景数据集技术选型功能实现创新点 今天我将分享一个基于NLP的微博情感分析项目&#xff0c;通过Python技术、NLP模型和Flask框架&#xff0c;对微博数据进行清洗、分词、可视化&#xff0c;并利用NLP和贝叶斯进行情感分…

【51单片机系列】独立按键介绍

本文是关于独立按键的介绍及使用。首先介绍了按键&#xff0c;包括什么是按键及使用按键时如何实现软件消抖。然后使用proteus仿真实现独立按键控制LED指示灯的操作。 之前的LED、蜂鸣器、数码管中IO口都是作为输出使用&#xff0c;这里通过独立按键实验介绍IO口作为输入的使用…

web,Apache简述

一.HTTP请求访问的完整过程 1.建立连接 2.接收请求 3.处理请求 4.访问资源 服务器获取请求报文中请求的资源web服务器&#xff0c;即存放了web资源的服务器&#xff0c;负责向请求者提供对方请求的静态资源&#xff0c;或动态运行后生成的资源 静态资源&#xff1a;不需要…

如何使用bash写脚本

本章主要介绍如何使用bash写脚本。 了解通配符了解变量了解返回值和数值运算数值的对比判断语句循环语句 grep的用法是“grep 关键字 file”&#xff0c;意思是从file中过滤出含有关键字的行。 例如&#xff0c;grep root /var/log/messages&#xff0c;意思是从/var/log/me…

C++笔记之C语言中的换行符和转义符

C笔记之C语言中的换行符和转义符 文章目录 C笔记之C语言中的换行符和转义符 在C语言中&#xff0c;换行符和转义符用于在字符串和字符常量中表示特殊字符。下面是关于换行符和转义符的解释&#xff1a; 换行符&#xff08;Newline character&#xff09;&#xff1a; 在C语言中…

前端知识(十三)——JavaScript监听按键,禁止F12,禁止右键,禁止保存网页【Ctrl+s】等操作

禁止右键 document.oncontextmenu new Function("event.returnValuefalse;") //禁用右键禁止按键 // 监听按键 document.onkeydown function () {// f12if (window.event && window.event.keyCode 123) {alert("F12被禁用");event.keyCode 0…

MySQL Server 层和引擎层是如何交互的

Server 层、引擎层、BufferPool、磁盘间的关系 大体来说&#xff0c; MySQL可以分为Server层和存储引擎层两部分。 1&#xff09;Server 层&#xff1a;Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖MySQL的大多数核心服务功能&#xff0c;以及所…

FaceBook推出新的翻译模型Seamless!可实现跨语言交流的无缝衔接!

FaceBook **&#xff08;中文名&#xff1a;脸书&#xff09;**近期发布了一个新的翻译模型 Seamless Communication&#xff0c;可实现跨语言实时"无缝"交流。 该模型可以保留跨语言的表达方式和复杂性&#xff08;翻译时保留语音中的停顿和语速&#xff0c;以及声…

12.9_黑马数据结构与算法笔记Java

目录 057 多路递归 e03 杨辉三角2 thinking&#xff1a;二维数组的动态初始化&#xff1f; 057 多路递归 e03 杨辉三角3 058 链表 e01 反转单向链表1 058 链表 e01 反转单向链表2 058 链表 e01 反转单向链表3 递归 058 链表 e01 反转单向链表4 为什么是returnn1呢&…

递归的两个特点、典型案例----汉诺塔问题

一、递归的两个特点 1、要自己调用自己 2、递归函数里要有结束条件。 二、汉诺塔问题 有三根柱子&#xff0c;现在在一根柱子上&#xff0c;从下往上&#xff0c;按照大小顺序摞着很多盘子。现在要把这些盘子全部放到另一根柱子上&#xff0c;且盘子依然按照从大到小顺序摞着…

触手可及的便携CD播放器,随时享受音乐乐趣,山灵EC Mini上手

如今做发烧级实体CD播放器的国产品牌越来越少了了&#xff0c;最近我尝试了一款山灵的便携式CD播放器&#xff0c;感觉它做得很有味道。在CD机领域&#xff0c;山灵技术积累的不错&#xff0c;像是这款EC Mini&#xff0c;不论设计还是体验都很出色&#xff0c;既能够满足实体C…

基于Java SSM框架实现电影售票系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现电影售票系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…

第1章-第1节-编写第一个Java程序并在命令行编译和运行

第一个Java程序不用任何IDE&#xff0c;用记事本去编写&#xff0c;用命令行去编译并运行&#xff0c;这样便于了解Java程序运行原理。 1、首先打开记事本&#xff0c;写下如下代码&#xff1a; 然后另存为xxx.java&#xff0c;xxx文件名不强求与类名相同&#xff0c;但是建议…

bootstrap:选项卡功能DEMO

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>选项卡</title> <link rel"stylesheet" type"text/css" href"/cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css" />…

Python Faker库:轻松生成测试数据

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python Faker库&#xff1a;轻松生成测试数据&#xff0c;全文3300字&#xff0c;阅读大约8分钟。 在开发和测试过程中&#xff0c;经常需要使用虚假数据。Python的Faker库为…

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 52页论文及代码

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 52页论文及代码 1 题目 C题蔬菜类商品的自动定价与补货决策 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就…

基于Java SSM框架实现高校信息资源共享平台系统【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现高校信息资源共享平台系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们…

this.$emit(‘update:isVisible‘, false)作用

这个写是不是很新颖&#xff0c;传父组件传值&#xff01;这是什么鬼。。。 假设你有以下逻辑业务。在A页面弹出一个组件B&#xff0c;A组件里面使用B组件&#xff0c;是否展示B组件你使用的是baselineShow变量控制&#xff01; <BaselineData :isVisible.sync"basel…

鸿蒙OS应用开发之数据类型

前面学习了一个简单的例子&#xff0c;这是多年来学习应用程序开发的经典路径&#xff0c;在这里也是这种待遇&#xff0c;通过这样的学习明白了一个简单应用是怎么样构成的&#xff0c;知道它是怎么运行输出的。在这个基础之上&#xff0c;你还是不会开发应用程序的&#xff0…