广告
返回顶部
首页 > 资讯 > 后端开发 > Python >聊聊如何打印GC日志排查的问题
  • 553
分享到

聊聊如何打印GC日志排查的问题

2024-04-02 19:04:59 553人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录如何打印GC日志排查问题先来看个示例那么上面打印出来的日志,具体是什么意思呢?小结一下gc日志打印时间戳如何打印GC日志排查问题 在工作当中,有时候我们会需要打印GC的相关信息来

如何打印GC日志排查问题

在工作当中,有时候我们会需要打印GC的相关信息来定位问题。该如何做呢?

先来看个示例


public static void main(String[] args) {
        List<Integer> list0 = new ArrayList<>();
        long start0 = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            list0.add(i);
        }
        System.out.println("cost: " + (System.currentTimeMillis() - start0));

        List<Integer> list1 = new ArrayList<>();
        long start1 = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            list1.add(i);
        }
        System.out.println("cost: " + (System.currentTimeMillis() - start1));
    }

直接运行,结果如下

cost: 135

cost: 85

你应该觉得奇怪,同样的往一个list插入100万条数据,为啥第一个耗时比较久?

这种时候,有经验的工程师应该能马上怀疑是GC的问题,我们可以通过在运行时添加JVM参数来打印程序运行时的GC情况。


-XX:+PrintGCDetails

如果是使用idea来运行,可以在 run configurations 的 VM options添加上面的参数即可。

再次运行,输出如下

[GC (Allocation Failure) [PSYoungGen: 1536K->512K(1536K)] 1884K->1234K(262144K), 0.0009030 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1302K->1017K(2560K)] 2025K->1948K(263168K), 0.0012290 secs] [Times: user=0.01 sys=0.01, real=0.01 secs]
[GC (Allocation Failure) [PSYoungGen: 2553K->1504K(3072K)] 3484K->3051K(263680K), 0.0017210 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 3040K->2033K(4608K)] 4587K->4228K(265216K), 0.0023170 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 4593K->2560K(5120K)] 8195K->6681K(265728K), 0.0249700 secs] [Times: user=0.31 sys=0.00, real=0.03 secs]
[GC (Allocation Failure) [PSYoungGen: 5120K->3584K(6656K)] 11352K->11408K(267264K), 0.0241680 secs] [Times: user=0.30 sys=0.01, real=0.03 secs]
[GC (Allocation Failure) [PSYoungGen: 6656K->3296K(7680K)] 17645K->17909K(268288K), 0.0349010 secs] [Times: user=0.45 sys=0.00, real=0.03 secs]
[GC (Allocation Failure) [PSYoungGen: 6368K->3328K(10240K)] 25729K->25825K(270848K), 0.0314260 secs] [Times: user=0.40 sys=0.00, real=0.03 secs]
cost: 137
[GC (Allocation Failure) [PSYoungGen: 8166K->4469K(10240K)] 30663K->30103K(270848K), 0.0285370 secs] [Times: user=0.36 sys=0.01, real=0.03 secs]
[GC (Allocation Failure) [PSYoungGen: 9166K->3785K(13312K)] 34800K->33427K(273920K), 0.0226780 secs] [Times: user=0.28 sys=0.01, real=0.02 secs]
[GC (Allocation Failure) [PSYoungGen: 11465K->6142K(13824K)] 41107K->38511K(274432K), 0.0065540 secs] [Times: user=0.08 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 13822K->7837K(19456K)] 46191K->44246K(280064K), 0.0099720 secs] [Times: user=0.11 sys=0.01, real=0.01 secs]
cost: 79

所以你大概明白了,第一次minor gc的次数比第二次多,所以运行时间比较长。

那么上面打印出来的日志,具体是什么意思呢?

已经有人画出了很详细的图,我借来用下

在这里插入图片描述

在这里插入图片描述

如果想了解 GC 的更多的内容,可以看看 oracle 官方对于 HosSpotJVM GC的详细介绍

小结一下

了解GC日志的打印方法,并且能看懂GC日志,对于查找定位问题非常有帮助的。

我自己就遇到过生产上一个CPU飙到好几百的情况,打印GC日志发现 JVM 一直在 fullGC,而且每次GC之后内存基本没有变化,从而定位到应用程序可能存在内存泄漏的问题。

gc日志打印时间戳

今天发现在jvm参数中,用-XX:+PrintGCDateStamps 替换 -XX:PrintGCTimeStamps,就可以打印真实的gc时间信息,而不像现在相对启动时间的秒数。

有了真实时间戳,可以方便与应用的log做对比,便于分析排查问题。

线下实验过,真实有效gc日志打印时间戳

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 聊聊如何打印GC日志排查的问题

本文链接: https://www.lsjlt.com/news/135581.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 聊聊如何打印GC日志排查的问题
    目录如何打印GC日志排查问题先来看个示例那么上面打印出来的日志,具体是什么意思呢?小结一下gc日志打印时间戳如何打印GC日志排查问题 在工作当中,有时候我们会需要打印GC的相关信息来...
    99+
    2022-11-12
  • 如何使用安装日志排查Office中的安装问题
    要使用安装日志排查Office中的安装问题,您可以按照以下步骤操作:1. 打开“控制面板”并选择“程序”(或“程序和功能”)。2. ...
    99+
    2023-09-08
    Office
  • 如何解决springboot log4j2不能打印框架错误日志的问题
    这篇文章主要介绍如何解决springboot log4j2不能打印框架错误日志的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!springboot log4j2为什么不能打印框架错误日志问题使用springboo...
    99+
    2023-06-20
  • 如何在go中处理http日志以便更好地排查问题?
    在一个web应用程序中,日志是非常重要的,因为它可以帮助我们快速地定位问题并进行排查。在http应用程序中,http日志是一种特殊的日志类型,它记录了每个请求和响应的详细信息。在这篇文章中,我们将介绍如何在go中处理http日志以便更好地...
    99+
    2023-08-04
    http 面试 日志
  • 如何利用Java日志技术,快速排查应用程序异常问题?
    随着互联网的飞速发展,应用程序的重要性越来越被人们所重视。然而,应用程序的开发和维护并不是一件容易的事情,往往会出现各种各样的异常问题。这些异常问题如果不能快速地被排查和解决,可能会严重影响应用程序的性能和用户体验。 Java是一种流行的...
    99+
    2023-11-09
    同步 numy 日志
  • 你的Go路径设置是否有问题?如何使用Bash查看日志?
    如果你在使用Go语言开发应用程序时,经常遇到一些奇怪的错误,可能是因为你的Go路径设置有问题。正确设置Go路径对于顺利编译和运行程序至关重要。本文将介绍如何正确设置Go路径,并演示如何使用Bash查看日志。 第一步:检查Go路径设置 在开...
    99+
    2023-10-07
    path bash 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作