性能分析 | Java服务器内存过高&CPU过高问题排查
一、内存过高
1、内存过高一般有两种情况:内存溢出和内存泄漏
(1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错
(2)内存泄漏:不再使用的对象一直占据着内存不释放,导致这块内存浪费掉,久而久之,内存泄漏的对象堆积起来,也会导致物理机的内存被耗尽,出现OOM报错
2、内存过高的检测办法:通常我们的Java服务器部署在Linux机器上面,可以通过jvm自带的命令进行一些检测
(1)查看对象的数目和占用内存大小
①参数为Java程序的进程号,将结果导出到指定目录中,
jmap -histo:live <进程号> > <导出目录+文件名>
②示例如下,可以看到程序中各个对象所占用内存的情况,根据占用字节数大小降序显示,这里只能看出哪些对象占用内存高,但是还不能具体定位到问题代码,需要进一步排查
③一些特殊的标识的含义
[C 表示char[],一般与String对象相关,因为String其实就是基于char数组实现的
[S 表示short[]
[I 表示int[]
[B 表示byte[]
[II 表示int[][]
num #instances #bytes class name
----------------------------------------------
1: 585152 75635896 [C
2: 66541 71446496 [B
3: 1141734 36535488 java.util.HashMap$Entry
4: 176622 26086840 <constMethodKlass>
5: 176622 24034208 <methodKlass>
6: 17717 19584560 <constantPoolKlass>
7: 174454 18375128 [Ljava.util.HashMap$Entry;
8: 571222 13709328 java.lang.String
9: 832783 13324528 java.lang.Integer
10: 17717 13198840 <instanceKlassKlass>
11: 15092 11237440 <constantPoolCacheKlass>
12: 46779 10429728 [I
13: 191501 7660040 java.util.LinkedHashMap$Entry
14: 12599 6567592 <methodDataKlass>
15: 113526 6357456 java.util.HashMap
16: 197998 6335936 java.util.Hashtable$Entry
(2)如果需要进一步定位问题代码,那么就需要把Java程序的内存镜像导出,再具体分析了,通过如下命令导出程序的内存镜像
jmap -dump:format=b,file=<导出目录+文件名> <进程号>
(3)下载Memory Analyzer工具来分析内存镜像
http://www.eclipse.org/mat/
(4)打开软件后,File-->Open Heap Dump...,打开刚才导出的镜像文件,选择Leak Suspects Report,Finish,进入分析页面
Histogram:列表展示出内存中的对象数目和占用内存大小
Dominator Tree:列表展示出程序中每个线程中的对象数目和占用内存大小
Top Consumers:图表展示出每个线程的对象数目和占用内存大小
Top Components:图表展示出内存中的对象数目和占用内存大小
Leak Suspects:这个是最常用的,会自动检测分析内存异常的原因
右键对象-->show objects by class可以查看对象的具体情况
by incomming reference:显示引用该对象/线程的其他对象
by outgoing reference:显示当前对象/线程引用的其他对象
(5)点击Leak Suspects,程序会分析出可能存在内存问题的地方,继续点击Detail可以看到具体有哪些对象和线程,接下来就要根据具体情况具体分析了
二、CPU过高
1、当程序发现CPU过高的情况时,可以使用Windows系统的Process Explorer工具来找到CPU高消耗的线程,所以需要在Windows机器上面搭建好服务器的测试环境,尽量模拟出线上CPU飙升的情况
2、模拟好环境后,通过任务管理器,在进程一栏中找到Java程序的进程号
3、下载Process Explorer工具
https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
4、打开工具后,根据刚才的进程号找到进程
5、然后右键-->Properties,再选择Threads选项卡,点进CPU排序,可以找到消耗CPU最多的那个线程
6、使用科学计算器,将十进制的线程号转成十六进制,比如493620-->78834
7、到此已经拿到了可能出问题的进程号和线程号,接下来使用jvm内置的命令来导出Java的堆栈信息
jstack -l <进程号> > <导出目录+文件名>
8、打开导出的堆栈信息,并全文搜索刚刚拿到的十六进制的线程号,就可以找到出问题的代码具体位置了
*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,都会注明作者和来源。如出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜,感谢原作者。
性能分析 | Java服务器内存过高&CPU过高问题排查的更多相关文章
- MAT工具定位分析Java堆内存泄漏问题方法
一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...
- Java服务器内存过高&CPU过高问题排查
一.内存过高 1.内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错 (2)内存泄漏:不再使用的对象一直占据着内存不释 ...
- 性能分析(5)- 软中断导致 CPU 使用率过高的案例
性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前言 软中断基本原理,可参考这篇博客:https: ...
- 性能分析(2)- 应用程序 CPU 使用率过高案例
性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 系统架构背景 其中一台用作 Web 服务器,来模拟 ...
- 性能分析_linux服务器CPU_Load Average
CPU度量Load Average 1. 概念介绍 1.1 Linux系统进程状态 在linux中,process有以下状态: runnable (就绪状态):blocked waiting fo ...
- 性能分析-java程序篇之案例-工具和方法
1. 背景说明 线上服务响应时间超过40秒,登录服务器发现cpu将近100%了(如下图),针对此问题,本文说明排查过程.工具以定位具体的原因. 2. 分析排查过程 此类问题的排查,有两款神器可用,分别 ...
- 性能分析 | Java进程CPU占用高导致的网页请求超时的故障排查
一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多. 二.定位故障 根据这种故 ...
- 性能分析Linux服务器CPU利用率
CPU度量 1. 指标范围 1.1 User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+ ...
- 性能分析Linux服务器CPU利用率(转)
1. 指标范围 1.1 User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+sy时间超过 ...
随机推荐
- 安装jdk配置环境变量后jps command not found
配置Java环境变量的时候一般是 vi /etc/profile 然后按两个大写的G就会跑到最后一行去,然后配置写入下文: 这个时候你jps查看Java的进程会出现: 分析原因: 一般是配置之后,没有 ...
- c# 动态获取http通过post传来的json数据
//获取http通过post传来的json数据 using Newtonsoft.Json; public HttpResponseMessage Query() { var request=Syst ...
- sql注入原理,利用与防护
一.sql注入原理 注入攻击的本质就是把用户输入的数据当作代码来执行.所以注入攻击有两个必要条件 1.用户能够控制的输入. 2.原本程序要执行的代码,拼接了用户输入的数据. 二.sql注入分类 按照请 ...
- U盘装manjaro 18报Python error in job “initcpio”
更新: 还是不行,大家再找别的方法. 以下内容仅做参考,意义不大. U盘安装 用rufus做U盘,写入选DD模式,比ISO模式可靠点. 错误解决 报错信息: Error installing Manj ...
- jade-if-else-unless-case
if else - var lession = ['node','jade'] if lession if lession.length > 2 p 1 #{lession.join(', ') ...
- cmd生成大文件
用cmd生成一个大小一定的文件 输入fsutil file createnew 文件位置 文件大小(以字节为单位1024b=1kb) 列如:fsutil file createnew d:\my ...
- python3 random
一.random 1.生成伪随机数 2.伪随机数是可预测的,严格意义上不具有随机性质,通常用数学公式的方法(比如统计分布,平方取中等)获得 3.正如数列需要有首项,产生伪随机数需要一个初值用来计算整个 ...
- java学习笔记15-封装
把属性(成员变量)设置为私有(private),把方法设置为共有的(public),假如外界想要得到或者改变某个属性,只能通过方法来办到,这其实是封装的思想之一. 新建一个Student类,这个类有几 ...
- mysql运维相关
1.为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?2.现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统 ...
- Java基础 线程的通信的三个方法/ 交替数数线程 / 生产者&消费者线程问题
线程通讯笔记: /** 线程通信 三个方法: * wait(): 调用该方法 是该调用的方法的线程释放共享资源的锁,进入等待状态,直至被唤醒 * notify() : 可以唤醒队列中的第一个等待同一共 ...