JVM常见线上问题 → CPU 100%、内存泄露 问题排查

这篇博客介绍了如何在Windows和Linux环境下排查JVM中的CPU占用过高和内存泄露问题。通过`jstack`和`jmap`命令生成线程快照和堆转储快照,结合MAT工具进行分析,找出问题根源。同时,列举了JVM性能监控和分析的常用工具。
摘要由CSDN通过智能技术生成

前言

后文会从 Windows、Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ? 目前市面上还是有很多 Windows 服务器的,应用于传统行业、政府结构、医疗行业 等等;两个系统下的情况都演示下,有备无患

后文中用到了两个工具:Processor Explorer、MAT,它们是什么,有什么用,怎么用,本文不做介绍

cpu 100%

下面的示例中, cpu 的占有率没到 100%,只是比较高,但是排查方式是一样的,希望大家不要钻牛角尖

Windows

1、找到 cpu 占有率最高的 java 进程号

PID: 20260

2、根据进程号找到 cpu 占有率最高的线程号

双击刚刚找到的 java 进程

线程号: 15900 ,转成十六进制: 3e1c

3、利用 jstack 生成虚拟机中所有线程的快照

命令: jstack -l {pid} > {path}

文件路径: D:\20260.stack

4、线程快照分析

我们先浏览下快照内容

内容还算比较简洁,线程快照格式都是统一的,我们以一个线程快照简单说明下

"main" #1 prio=5 os_prio=0 tid=0x0000000002792800 nid=0x3e1c runnable [0x00000000025cf000]

我们前面找到占 cpu 最高的线程号: 15900 ,十六进制: 3e1c ,用 3e1c 去快照文件里面搜一下

自此,找到问题

Linux

排查方式与 Windows 版一样,只是命令有些区别

1、找到 cpu 占有率最高的 java 进程号

使用命令: top -c 显示运行中的进程列表信息, shift + p 使列表按 cpu 使用率排序显示

PID = 2227 的进程,cpu 使用率最高

2、根据进程号找到 cpu 占有率最高的线程号

使用命令: top -Hp {pid} ,同样 shift + p 可按 cpu 使用率对线程列表进行排序

正在上传…重新上传取消

PID = 2228 的线程消耗 cpu 最高,十进制的 2228 转成十六进制 8b4

3、利用 jstack 生成虚拟机中所有线程的快照

4、线程快照分析

分析方式与 Windows 版一致,我们可以把 2227.stack 下载到本地进行分析,也可直接在 Linux 上分析

在 Linux 上分析,命令: cat 2227.stack |grep '8b4' -C 5

至此定位到问题

不管是在 Windows 下,还是在 Linux 下,排查套路都是一样的

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值