Jvm FullGC 如何排查?

2024-02-05 04:12
文章标签 java jvm 排查 fullgc

本文主要是介绍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

这篇关于Jvm FullGC 如何排查?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679725

相关文章

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll