首页 > 系统相关 >JVM 常见线上问题 → CPU 100%、内存泄露 问题排查

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

时间:2022-11-03 12:34:37浏览次数:60  
标签:快照 Windows 100% cpu 排查 线程 内存 JVM CPU

开心一刻

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

明明是个小 bug,但就是死活修不好,我特么心态崩了......

前言

Windows

  后文中用到了两个工具:​​Processor Explorer​​​、​​MAT​​,它们是什么,有什么用,怎么用,本文不做介绍,不知道的小伙伴最好先去做下功课

cpu 100%

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

  Windows

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

      

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

20260

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

      双击刚刚找到的 java 进程

      

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

15900 ,转成十六进制: 3e1c

jstack

jstack -l {pid} > {path}

      

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

D:\20260.stack

    4、线程快照分析

      我们先浏览下快照内容

      

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

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

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

      

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

3e1c

      

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

      自此,找到问题

      

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

  Linux

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

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

top -c 显示运行中的进程列表信息, shift + p

      

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

PID = 2227

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

top -Hp {pid} ,同样 shift + p

      

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

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

jstack

      

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

    4、线程快照分析

2227.stack

cat 2227.stack |grep '8b4' -C 5

      

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

      至此定位到问题

      

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

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

    

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

内存泄露

  同样的,Windows、Linux 各展示一个示例

  Windows

PID

      

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

idea 内存占有率最高,因为我是以 idea 启动的 java 进程;idea 进程我们无需关注,我们找到内存占有率最高的 java 的 PID: 10824

jmap

jmap -dump:format=b,file={path} {pid}

      

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

D:\heapdump_108244.hprof

MAT

      MAT:Memory Analyzer Tool,是针对 java 的内存分析工具;下载地址:

      

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

1024m ,而我们的 dump 文件往往大于 1024m,所以我们需要调整,在 mat 的 home 目录下找到 MemoryAnalyzer.ini ,将 -Xmx1024m 修改成大于 dump 大小的空间, 我把它改成了 -Xmx4096m

      接着我们就可以将 dump 文件导入 mat 中,开始 dump 文件的解析

      

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

      解析是个比较漫长的过程,我们需要耐心等待

      

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

      解析完成后,我们可以看到如下概况界面

      

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

      各个窗口的各个细节就不做详细介绍了,有兴趣的可自行去查阅资料;我们来看看几个图:饼状图、直方图、支配树、可疑的内存泄露报告

      饼状图

        

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

com.lee.schedule.Schedule

      直方图

        

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

        我们看下 Person 定义

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Person {

private String name;
private Integer age;

}

View Code

        可想而知,上图标记的几项都与 Person 有关

      支配树

        

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

        这就非常直观了,Schedule 中的 ArrayList 占了 99.04% 的大小

      可疑的内存泄露报告

        

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

      通过这些数据,相信大家也能找到问题所在了

      

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

  Linux

    排查方式与 Windows 一样,只是有稍许的命令区别

    1、找到内存占有率最高的进程号

top -c 显示运行中的进程列表信息, shift + m

      

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

2527

jmap

jmap -dump:format=b,file={path} {pid}

      

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

/opt/heapdump_2527.hprof

MAT

heapdump_2448.phrof 下载到本地,利用 MAT

      

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

      自此,定位到问题

    Windows 下与 Linux 下,排查流程是一样的

    

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

总结

  JVM 常用命令

    jps:列出正在运行的虚拟机进程

    jstat:监视虚拟机各种运行状态信息,可以显示虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据

    jinfo:实时查看和调整虚拟机各项参数

    jmap:生成堆转储快照,也可以查询 finalize 执行队列、Java 堆和永久代的详细信息

    jstack:生成虚拟机当前时刻的线程快照

    jhat:虚拟机堆转储快照分析工具

      与 jmap 搭配使用,分析 jmap 生成的堆转储快照,与 MAT 的作用类似

  排查步骤

PID

stack (或堆转储快照: hprof

    3、分析快照(或堆转储快照),定位问题

  内存泄露、内存溢出和 CPU 100% 关系

     

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

  常用 JVM 性能检测工具

    Eclipse Memory Analyer、JProfile、JProbe Profiler、JVisualVM、JConsole、Plumbr

参考

  ​​一次完整的JVM堆外内存泄漏故障排查记录​​

  ​​【原创】谈谈线上CPU100%排查套路​​

  ​​紧急修复一次线上商城系统高并发优化实战​

  面试官:如果你们的系统 CPU 突然飙升且 GC 频繁,如何排查?

  ​​记一次公司JVM堆溢出抽丝剥茧定位的过程​​

  ​​MAT:一次线上内存泄漏排查​

  ​​JVM探秘:MAT分析内存溢出​​



标签:快照,Windows,100%,cpu,排查,线程,内存,JVM,CPU
From: https://blog.51cto.com/u_13423706/5819392

相关文章

  • 列出100以内的素数
    1#include<stdio.h>2intmain()3{4intx;5for(x=2;x<100;x++)6{7inti;8intisPrime=1;9for(i=2;i<x;i+......
  • UD6KB100-ASEMI新能源专用整流桥UD6KB100
    编辑:llUD6KB100-ASEMI新能源专用整流桥UD6KB100型号:UD6KB100品牌:ASEMI封装:D3K正向电流:6A反向电压:1000V引脚数量:4芯片个数:4芯片尺寸:88MIL漏电流:>10ua恢复时间:>2000ns浪涌电流......
  • 910001 CAD布局背景调成黑色
    1、打开CAD软件,输入op命令后按下键盘上的回车键。2、点击显示,再点击颜色。3、将颜色改为黑色,点击“应用并关闭”。4、去掉勾选显示图纸背景,点击“确定”即可。这样......
  • k8s节点升级cpu与内存后,静态pod无法启动-cpuManagerPolicy
    简述: 最近k8s master内存压力比较大, pod数量越来越多, 打算对cpu 内存进行扩容扩容有 cpu4C/8G, 变更成8C/16G, 通过升级后,发现apiserver 静态pod无法启动,在kube......
  • JVM学习笔记——内存结构篇
    JVM学习笔记——内存结构篇在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分我们会分为以下几部分进行介绍:JVM整体介绍程序计数器虚拟机栈......
  • 既然CPU有缓存一致性协议(MESI),为什么JMM还需要volatile关键字?
    缓存一致性协议是保证“硬件CPU的cache”和“硬件内存”之间数据的一致性,更详细说也就是缓存一致性协议是保证“物理计算机中的硬件CPUcache”和“物理计算机中的......
  • 50万的软件,为什么能卖到1000万?
    文/王不留(微信公众号:程序员生存指南) 与公司的销售高手吃饭聊天,自然会谈到营销的话题。 隔行如隔山,自己搞交付的,一直对做销售的人有所佩服,吃个饭就能搞定一单。 听他一......
  • 代码随想录day34 | 1005.K次取反后最大化的数组和 134.加油站 135. 分发糖果
    1005.K次取反后最大化的数组和题目|文章思路如何让翻转后的数组和最大,就是尽可能的反转绝对值大的负数。当反转次数多余时,不断反转绝对值最小的数。首先将整个数组按......
  • Centos下查看cpu核数
    1.概念物理CPU:实际Server中插槽上的CPU个数。物理cpu数量:可以数不重复的physicalid有几个。2.逻辑CPULinux用户对/proc/cpuinfo这个文件肯定不陌生.它是用来存......
  • Docker容器 获取宿主机CPU信息等或重启网卡命令操作介绍
    1.知识点介绍A.Docker和宿主机共用一个内核,Namespace的隔离依然没有完全隔离Linux资源,如:/proc、/sys、/dev/sd*等目录;B.使用Docker容器问题:在容器中执行top、......