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…

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

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

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

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

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

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

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

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

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

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

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 厌倦…

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…

2024年最新幻兽帕鲁服务器搭建教程

玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

深度解析源码,Spring 如何使用三级缓存解决循环依赖

目录 一. 前言 二. 基础知识 2.1. 什么是循环依赖? 2.2. 三级缓存 2.3. 原理执行流程 三. 源码解读 3.1. 代码入口 3.2. 第一层 3.3. 第二层 3.4. 第三层 3.5. 返回第二层 3.6. 返回第一层 四. 原理深度解读 4.1. 什么要有三级缓存? 4.2.…

【HarmonyOS 4.0 应用开发实战】ArkTS 快速入门

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

python中[[]] * (n)和[[] for _ in range(n)]的区别

1、现象 刷leetcode207的时候碰到一个坑,用[[]] * (n)初始化二维数组,逻辑是正确的,但是结果始终不对。 2、原因 最后定位是初始化语句使用错误导致的,我使用的是[[]] * (n),应该使用[[] for _ in range(n)] 3、解…

Stable Diffusion 模型下载:ReV Animated

模型介绍 该模型能够创建 2.5D 类图像生成。此模型是检查点合并,这意味着它是其他模型的产物,以创建从原始模型派生的产品。 条目内容类型大模型基础模型SD 1.5来源CIVITAI作者s6yx文件名称revAnimated_v122EOL.safetensors文件大小5.13GB 生成案例 …

redis数据库设置对象的过期时间,到期后自动删除该条数据

redis数据库设置对象的过期时间,到期后自动删除该条数据!过期时间的事情经常发生。比如大家领到了一些购物券。这张购物券有一个过期时间。必须在某节点之前(某年某月末日)之前,使用掉,否则该券就会过期,无…

Aigtek高压放大器用途是什么呢

高压放大器在电子领域中扮演着至关重要的角色,其主要作用是将低电压信号放大到更高的电压水平。这种类型的放大器广泛用于各种应用中,以下是高压放大器的用途以及其关键作用的详细介绍。 1、科学研究和实验室应用: 高压放大器在科学研究和实验…

【Linux】Linux权限

Hello everybody!在介绍完Linux操作系统常用的基本指令后,咱们就要开始权限的讲解了。如果没有看过我之前文章的宝子们可以去看看呦!有比较系统的指令讲解! 回到正题,关于权限,实际上没有大家想象中的那么神秘&#x…