一、内存过高

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
----------------------------------------------
: [C
: [B
: java.util.HashMap$Entry
: <constMethodKlass>
: <methodKlass>
: <constantPoolKlass>
: [Ljava.util.HashMap$Entry;
: java.lang.String
: java.lang.Integer
: <instanceKlassKlass>
: <constantPoolCacheKlass>
: [I
: java.util.LinkedHashMap$Entry
: <methodDataKlass>
: java.util.HashMap
: 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过高(Windows系统)

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最多的那个线程的十进制线程ID

三、CPU过高(Linux系统)

1、我们的Java服务器一般都是部署在Linux系统上面的,当出现CPU过高时,可以先用top命令找到CPU过高的Java进程的进程号

2、然后进一步使用进程号来查看线程的情况

top -H -p <PID>

四、分析CPU问题

1、上面我们找到了CPU过高的具体十进制线程号,使用科学计算器,将十进制的线程号转成十六进制,比如493620-->78834

2、到此已经拿到了可能出问题的进程号和线程号,接下来使用jvm内置的命令来导出Java的堆栈信息

jstack -l <进程号> > <导出目录+文件名>

3、打开导出的堆栈信息,并全文搜索刚刚拿到的十六进制的线程号,就可以找到出问题的代码具体位置了

五、常用的分析工具

1、查看Java进程中GC的情况,可以看到新生代老年代等的GC次数和GC时间等参数

jstat -gc <PID>

2、待补充

Java服务器内存过高&CPU过高问题排查的更多相关文章

  1. 性能分析 | Java服务器内存过高&CPU过高问题排查

    一.内存过高 1.内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错 (2)内存泄漏:不再使用的对象一直占据着内存不释 ...

  2. java 快速定位线上cpu偏高

    1.top -c 加 大写P 查找高进程ID 2.top -Hp 加 大写 P 查找高线程ID 3.printf '%x\n' 线程ID 转成16进制 4.jstack 进程ID | grep 16进 ...

  3. 记一次JAVA进程导致Kubernetes节点CPU飙高的排查与解决

    一.发现问题 在一次系统上线后,我们发现某几个节点在长时间运行后会出现CPU持续飙升的问题,导致的结果就是Kubernetes集群的这个节点会把所在的Pod进行驱逐(调度):如果调度到同样问题的节点上 ...

  4. Java / JVM CPU 利用率高 - 诊断方法 1 - Thread Dump 结合 OS 诊断

    IBM AIX Java 1. topas 命令定位 CPU 使用高的进程,比如下面 PID 614852 Name            PID  CPU% java         614852  ...

  5. SQL Server占用服务器内存过高

    SQL Server对服务器内存的使用策略是用多少内存就占用多少内存,只用在服务器内存不足时,才会释放一点占用的内存,所以SQL Server 服务器内存往往会占用很高. 查看内存状态: DBCC M ...

  6. C#正则表达式引发的CPU跑高问题以及解决方法

    3月23日(周日)下午16:30左右,博客园主站负载均衡中的2台Web服务器CPU玩起了爬楼梯的游戏(见上图),一直爬到了接近100%.发现这个状况后,我们立即将这2台阿里云临时磁盘云服务器从负载均衡 ...

  7. Java Performance - 如何调查解决 CPU 问题

    随着硬件的发展,往往服务器会配置足够的 CPUs, Java Server/服务器不太有 CPU 问题:但是偶尔因为 代码海量循环 或者 线程安全性(thread safe), 还是会带来 CPU 问 ...

  8. 通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码

    http://heylinux.com/archives/1085.html通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码 首先,要感谢我的好朋友 钊花 的经验分享. 相信 ...

  9. java程序——CPU过高100%及内存泄露排查

    CPU过高 这类问题可以使用 top 命令观察一些,CPU 是不是都被 Java 程序占用了.比如下面这个截图: 服务器的 CPU 大多都被 Java 占用了.这正是我们之前生产上 CPU 过高的一个 ...

随机推荐

  1. BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流

    BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...

  2. Java IO--字符流--BufferedReader和BufferedWriter

    从昨天开始没事情干时,决定梳理梳理Java IO流,因为觉得太混乱这个东西,妈的,咋就这么多类型,想累死谁啊,这里并不是埋怨创造者,而是气自己看着看着老跑偏,实在看不进去,太多了,想睡觉,所以现在决定 ...

  3. 从壹开始前后端分离【 .NETCore2.1 +Vue 2 +AOP+DI】框架之一 || 前言

    缘起 作为一个.Net攻城狮已经4年有余了,一直不温不火,正好近来项目不是很忙,闲得无聊,搞一搞新技术,一方面是打发无聊的时间,一方面也是督促自己该学习辣!身边的大神都转行的转行,加薪的加薪,本人比较 ...

  4. 《HelloGitHub》第 34 期

    公告 新年快乐!大家的年终奖都发了啥? <HelloGitHub>第 34 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源 ...

  5. token:NLP之词形还原

    已迁移到我新博客,阅读体验更佳token:NLP之词形还原 完整代码实现放在我的github上:click me 一.任务描述 形态还原算法: 输入一个单词 如果词典里有该词,输出该词及其属性,转4, ...

  6. PHP扩展高性能日志系统SeasLog简单上手

    Windows部分:-------------------------------------------------------- https://pecl.php.net/package/Seas ...

  7. java基础(七)-----深入剖析Java中的装箱和拆箱

    本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型 ...

  8. 使用Fiddler获取OAuth2认证的access token时候返回502

    微软动态CRM专家罗勇 ,回复322或者20190402可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 我这里Fiddler的Composer功能来获取OAuth2 认 ...

  9. 一款Android图文识别与扫描软件

    OCR图文识别App 是一款准确高效的 OCR文字识别与扫描软件,识别准确度高,速度快,扫描文件清晰,可导出TXT.Excel. 免费使用. 技术 基于百度在业界领先的人工智能与深度学习技术,提供对身 ...

  10. sqlserver的坑

    1.今天系统出现BUG,经过两个小时的排查,发现是存储过程中的SELECT @@IDENTITY的值发生错乱,导致的系统BUG,经过百度,发现这个函数貌似和触发器有冲突,一旦插入的表有触发器的话,@@ ...