您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

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

时间:2020-10-10 10:24:39  来源:  作者:

前言

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

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

cpu 100%

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

Windows

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

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

 

PID: 20260

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

双击刚刚找到的 java 进程

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

 

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

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

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

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

 

文件路径: D:20260.stack

4、线程快照分析

我们先浏览下快照内容

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

 

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

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

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

 

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

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

 

自此,找到问题

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

 

Linux

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

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

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

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

 

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

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

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

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

 

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

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

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

 

4、线程快照分析

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

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

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

 

至此定位到问题

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

 

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

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

 

内存泄露

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

Windows

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

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

 

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

2、利用 jmap 生成堆转储快照

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

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

 

dump 文件路径: D:heapdump_108244.hprof

3、利用 MAT 分析 dump 文件

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

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

 

选择对应的版本,下载后直接解压;默认情况下,mat 最大内存是 1024m ,而我们的 dump 文件往往大于 1024m,所以我们需要调整,在 mat 的 home 目录下找到 MemoryAnalyzer.ini ,将 -Xmx1024m 修改成大于 dump 大小的空间, 我把它改成了 -Xmx4096m

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

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

 

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

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

 

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

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

 

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

饼状图

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

 

可以看出, com.lee.schedule.Schedule 对象持有 1G 内存,肯定有问题

直方图

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

 

我们看下 Person 定义

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

 

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

支配树

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

 

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

可疑的内存泄露报告

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

 

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

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

 

Linux

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

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

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

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

 

进程号: 2527

2、利用 jmap 生成堆转储快照

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

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

 

堆转储快照文件路径: /opt/heapdump_2527.hprof

3、利用 MAT 分析堆转储快照

将 heapdump_2448.phrof 下载到本地,利用 MAT 进行分析;分析过程与 Windows 版完全一致

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

 

自此,定位到问题

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

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

 

总结

JVM 常用命令

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

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

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

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

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

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

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

排查步骤

1、先找到对应的进程: PID

2、生成线程快照 stack (或堆转储快照: hprof )

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

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

 

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

 

常用 JVM 性能检测工具

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



Tags:JVM   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  Tags: JVM  点击:(11)  评论:(0)  加入收藏
亿级流量电商系统JVM模型参数预估方案,在原来的基础上采用ParNew+CMS垃圾收集器一、亿级流量分析及jvm参数设置1. 需求分析大促在即,拥有亿级流量的电商平台开发了一个订单系...【详细内容】
2021-10-25  Tags: JVM  点击:(39)  评论:(0)  加入收藏
为什么要有JVM? JVM就是Java运行虚拟机,那么虚拟机又分为系统虚拟机和程序虚拟机,而JVM是属于程序虚拟机,所以不要看到是虚拟机就误认为JVM是系统虚拟机。 JVM是帮助Java程序开...【详细内容】
2021-06-09  Tags: JVM  点击:(155)  评论:(0)  加入收藏
JVM架构 从上图可以很清晰的看出,jvm架构分成三大部分 类加载子系统 运行时数据区 执行引擎1,类加载子系统Java的动态类加载功能就是由类加载子系统完成的。类加载子系统在运...【详细内容】
2021-04-20  Tags: JVM  点击:(228)  评论:(0)  加入收藏
1:什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java...【详细内容】
2021-04-12  Tags: JVM  点击:(251)  评论:(0)  加入收藏
背景目前,有很多公司的WEB服务器会出现CPU、内存、IO告警,运维人员往往不能及时地获取JVM等相关信息,以便分析造成告警的原因,故本文将从几个方面来阐述如何进行JVM快照,如何分析...【详细内容】
2021-03-12  Tags: JVM  点击:(168)  评论:(0)  加入收藏
平时开发的项目,有的是打成一个war包,放到tomcat这样的容器里运行。或者是打成一个jar包,通过java -jar 的方式去运行。大家有没有想过我们的项目是如何运行的呢?首先编译器会把...【详细内容】
2021-01-22  Tags: JVM  点击:(170)  评论:(0)  加入收藏
1 类加载器在类加载器家族中存在着类似人类社会的权力等级制度:1.1 Bootstrap由C/C++实现,启动类加载器,属最高层,JVM启动时创建,通常由与os相关的本地代码实现,是最根基的类加载...【详细内容】
2021-01-20  Tags: JVM  点击:(192)  评论:(0)  加入收藏
Thread Dump介绍Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread...【详细内容】
2021-01-18  Tags: JVM  点击:(169)  评论:(0)  加入收藏
什么是 Java 虚拟机(JVM)中的垃圾收集(GC)日志、线程转储和堆转储?Java 虚拟机(JVM)生成3个关键文件,这些文件对于JVM优化性能和解决生产问题非常有用。这些文件是: (GC) Garb...【详细内容】
2021-01-13  Tags: JVM  点击:(162)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条