Jvm FullGC 如何排查?

使用场景

我们在使用系统时,有时请求和响应会变得特别慢,系统也变得很卡。

有可能是FullGC的问题,可以逐步地进行排查。

使用jps和top确定进程号pid

jps可以列出正在运行的jvm进程,并显示jvm执行主类名称( main()函数所在的类),以及进程id。

命令如下:

jps -l

结果如下:

而top命令查看cpu使用情况,获取对应的进程号pid:

top

如下所示,发现进程号pid为72的进程占用了近100%的cpu:


如果想知道该进程是什么,可以使用以下命令查看:

ps -ef | grep 进程号

jstat检查进程号的gc,是否发生fullGC:

jstat,就是JVM Statistics Monitoring Tool.
下面这个命令的意思是每隔2s显示pid为72的进程的GC情况:

jstat -gcutil 72 2000

结果如下:

我们主要观察FGC这个参数,可以发现,每隔几秒,FGC的次数就会变多。

具体的含义如下:

参数含义:
S0 : Heap 上的 Survivor space 0 段已使用空间的百分比
S1 : Heap 上的 Survivor space 1 段已使用空间的百分比
E : Heap 上的 Eden space 段已使用空间的百分比
O : Heap 上的 Old space 段已使用空间的百分比
P : Perm space 已使用空间的百分比
YGC :从程序启动到采样时发生 Young GC 的次数
YGCT : Young GC 所用的时间 ( 单位秒 )
FGC :从程序启动到采样时发生 Full GC 的次数
FGCT : Full GC 所用的时间 ( 单位秒 )
GCT :用于垃圾回收的总时间 ( 单位秒 ) 

查看在这个进程中消耗cpu最多的线程

命令如下:

top -H -p 72

可以查看在72这个进程的各个线程
-H表示 Threads-mode operation,线程模式,展示各个线程。
-p表示 Monitor-PIDs mode,监控模式,通过进程id监控进程。
详情见: https://blog.csdn.net/qq_31302009/article/details/77803006

结果如下,可以看到消耗cpu最多的线程号80和79:

  • 计算线程号的16进制结果
printf %x 79

将线程号80和79分别转换成16进制,将结果4f和50记下来,可以在后面的dump文件搜索。

jstack分析线程堆栈,并保存结果

  • 根据进程号,输出进程的线程dump文件。

以下命令是将进程号为72的dump文件,输出到 /tmp/dump_file这个路径,也可以是其他任意路径。

> 表示将命令执行的结果保存到文件并覆盖原文件的内容。

jstack 72 > /tmp/dump_file
  • 打开dump文件,根据之前printf %x计算得到的16进制结果搜索。

比如printf %x 79 计算得到的结果为4f,可以通过4f进行搜索,也可以用0x4f搜索。

(注:如果不想保存文件,也可以直接用命令

jstack -l 72 | grep 0x4f -C 10 

jstack -l显示线程堆栈详情,grep匹配关键字0x4f,-C 10表示显示关键字前后10行。)

主要看nid。 nid,意思是 native thread id. 每一个nid对应于linux下的一个tid。
jstack中的nid是十六进制数。
搜索找到 nid=0x4f 的线程,就可以拿到线程的堆栈,找到出问题的代码了。

如果想找出有死锁的线程,也可以通过 BLOCKED 关键字去匹配。

jstack –l 72 | grep -i –E 'BLOCKED | deadlock' 

jmap分析进程的内存使用情况

  • jmap分析进程72的内存使用情况,并保存dump文件

jmap,就是Java Memory Map.

jmap -histo 72 > pid72.log

以上命令中的 pid72.log是文件名称,也可以改用其他名称。而72是进程号。

查到 pid72.log 文件,内存的使用情况如下:

参数的含义如下:

说明:#instance 是对象的实例个数
#bytes 是总占用的字节数
class name 对应的就是 Class 文件里的 class 的标识
B 代表 byte
C 代表 char
D 代表 double
F 代表 float
I 代表 int
J 代表 long
Z 代表 boolean
前边有 [ 代表数组, [I 就相当于 int[]
对象用 [L+ 类名表示 

jhat分析jmap生成的堆内存快照

jhat,就是JVM Heap Analysis Tool,虚拟机堆内存快照分析工具。
jhat,可以用来分析jmap生成的堆内存文件。
除了jhat,也可以用专业用于分析dump文件的Memory Analyzer(MAT)等工具。

jmap -dump:format=b,file=a.hprof 72
jhat -J-Xmx512M a.hprof

a.hprof是文件名称,也可以改用其他命名。

结果如下:

屏幕显示"Server is ready."的提示后,用户在浏览器中输入http://要访问的ip:7000/,
比如 http://localhost:7000/ 就可以看到分析结果了。

分析结果默认是以包为单位进行分组显示,分析内存泄漏问题主要会使用到其中的 “Heap Histogram”,可以找到内存中总量最大的对象。

参考资料

《深入理解java虚拟机》
https://blog.csdn.net/weixin_34320159/article/details/91553350
https://www.cnblogs.com/kongzhongqijing/articles/3621223.html
https://www.cnblogs.com/kingszelda/p/9034191.html

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

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

相关文章

浙政钉(专有钉钉)

专有钉钉是浙政钉的测试版本,可在正式发布之前进行业务开发。 专有钉钉 原名政务钉钉 是高安全、强管控、灵活开放的面向大型组织专有独享的协同办公平台。支持专有云、混合云等多种方式灵活部署,以满足客户特定场景所需为目标,最大化以“平…

window 镜像---负载篇

前提:需要修改window的powershell执行脚本的策略 步骤:以管理员身份打开powershell,执行 Get-ExecutionPolicy查看当前执行策略,若返回值是Restricted,需执行Set-ExecutionPolicy RemoteSigned powershell 版本信息&am…

.NET Core已经开源好几年了, 为什么不像JVM那样很多人研究和调优其GC算法?

.NET Core的开源确实是微软近年来重要的一步,它不仅标志着.NET生态系统向更开放、更多样化的方向迈进,也为更广泛的社区参与和贡献提供了可能。然而,与JVM相比,研究和调优GC(垃圾回收)算法的工作似乎没有那…

gif格式图片是怎么做的?教你一招在线转换

常见的图片有jpg、png以及gif格式,其中,jpg和png格式的图片我们一般手机拍摄或是接受的都是这两种格式,但是gif格式的图片我们却需要从网上下载。那么,当我们想要自己制作gif动画的时候要怎么操作呢?只需要使用在线制作…

NDK Could NOT find OpenGL (missing: OPENGL_glx_LIBRARY) Ubuntu

1. update 该命令将安装一堆新包,包括gcc,g 和make。 sudo apt-get update sudo apt-get install -y build-essential2. install OpenGL依赖库 sudo apt-get install freeglut3-dev sudo apt-get install libgl1-mesa-dev sudo apt-get install libxt-…

MAE实战:使用MAE提高主干网络的精度(一)

摘要 MAE已经出来有几年了,很多人还不知道怎么去使用,本文通过两个例子说明一下。分两部分,一部分介绍一个简单的例子,让大家了解MAE训练的流程。一部分是一个新的模型,让大家了解如何将自己的模型加入MAE。 论文标…

【BBF系列协议】TR156 在TR101环境中使用GPON Access

TR-156 在TR-101环境中使用GPON Access 执行摘要 TR-101提供了一种基于以太网的体系结构,它已成为针对使用DSL作为宽带接入技术的住宅和企业客户的三联游戏部署的全球标准。然而,许多TR-101的体系结构规范都是与访问无关的,而且它们今天也与其他访问技术一起被广泛使用,特…

后端课程接口

路由:course/urls.py router.register(categories, views.CourseCategoryViewSet, categories) # 分类 router.register(free, views.CourseViewSet, free) # 课程视图:course/views.py from rest_framework.viewsets import GenericViewSet from re…

steam搬砖项目赚钱吗?操作流程看这一篇就够了

很多人应该听说过steam,它是国外一款知名的游戏社交平台,也是目前世界上最大的游戏平台之一。而steam搬砖项目,关键就是靠信息差。我们要做的就是在steam以低价买入道具装备,然后上架到网易buff卖出,赚取差价。 什么人…

【Mapstruct】MapStruct实战:简化Java Bean映射

虽然早就在用mapstruct了,但因为要快速原型开发,天天写builder模式,感觉太长了,不好看,(然后最近被同事说丑了 ),感觉还是做个总结,怒转mapstruct 问题背景或前提知识 …

【PLC一体机】PLC一体机中如何实现触摸屏和PC电脑的通讯

博主今天准备把之前买的PLC一体机拿出来玩一下,翻看以前的博文,发现没有记录分享PLC一体机中如何实现触摸屏程序下载的内容。 如之前博文介绍的那样,PLC一体机由PLC和触摸屏两部分集成的设备,因此设备内部已经做好了PLC和触摸屏之…

C++拷贝构造函数、赋值运算符重载

1.拷贝构造函数 拷贝构造函数的写法如图所示 调用方式如下 接下来我来说说它的特征 1.1特征 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。 拷贝构造函…

【SpringBoot1】Spring Boot是如何推断你的工程类型的

我们的工程一般都是基于java的Servlet的,但是除此之外还有其他类型的, 在WebApplicationType里定义了常见的类型: public enum WebApplicationType {/*** The application should not run as a web application and should not start an* e…

XGB-2: Boosted Trees(提升树)简介

XGBoost代表“Extreme Gradient Boosting”,其中术语“Gradient Boosting”来源于Friedman的论文《Greedy Function Approximation: A Gradient Boosting Machine》。 梯度提升树已经存在一段时间,关于这个主题有很多资料。本部分将使用监督学习的元素&…

【Chrono Engine学习总结】1-安装配置与程序运行

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置,建议首次安装只安装核心模块。然后依此configure下irrlicht,sensor…

6款超好用的IDEA插件,开发必备!

今天给大家介绍几款开发必备的IDEA插件: JRebel 热部署插件,让你在修改完代码后,不用再重新启动,很实用!但是,不是免费的,需要大家继续发挥下自己的聪明才智才能happy的使用 Json Parser 厌倦…

Vivado Tri-MAC IP端口说明

Trri-mac Ethernet IP端口详细说明 序号 Signal Name Direction Description 备注 Clock,Reset Definition 1 gtx_clk I MAC IP全局时钟输入,125MHz。使用时输入125MHz全局时钟。 2 refclk I MAC IP参考时钟输入,200MHz,该时钟用…

每周AI新闻(2024年第5周)ChatGPT等多应用登陆 Vision Pro | 字节Coze国内版上线等

我是陌小北,一个正在研究硅基生命的、有趣儿的碳基生命。每周日20:00,准时解读每周AI大事件。 大厂动向 【1】ChatGPT、钉钉、Firefly AI 登陆 Vision Pro OpenAI发布了新的ChatGPT App,允许Apple Vision Pro用户与GPT-4 Turbo模型进行自然…

Abp 从空白的WebApplication中添加EntityFrameworkCore生成数据库

书接上文:Abp 从空白WebApplication开始 开发环境:.NET6、Volo.Abp 数据库:Sqlite 说明:纯属个人强行入门。我个人觉得按照官网的操作不舒服,所以自己研究着来,请读者根据自己的需要进行参考。我能保证的…

Ubuntu+GPU搭建Stable-Diffusion教程

【前序】已经安装anaconda 1.git拉取项目到本地 执行git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 进入项目目录下 cd stable-diffusion-webui/ 2. 安装对应Python依赖包 首先安装pytorch和torchvision,若是GPU环境的用户需要安装与cu…