CPU过载、内存溢出问题一般出现在线上项目中,因为开发环境用户量和数据量都很小,即使你的代码有问题也不会爆发出来。线上出现这样的问题是比较严重的,需要认真对待,妥善解决。

问题原因

造成这样问题有两个大类型的原因:
一,性能问题,高并发高访问情况下线程太多,内存不够用;这个时候体现了多线程的一个危害,cpu过载而且可能内存溢出
二,代码问题,如代码中有死循环、一次查询数据量太大、存在太多对象引用内存无法回收(如集合里有大对象没有回收),数据库死锁等。
使用top, free, uptime等命令查看CPU、内存使用情况。 cpu、内存使用率阶段性较高时,是由于某段时间并发量比较高,导致服务器性能出现瓶颈,那么说明你可能需要升级服务器或者横向添加服务器做集群负载了。 当CPU、内存使用长时间居高不下,那么很可能是代码出现了问题。需要进一步排查了。

jstack排查cpu使用问题

步骤:
1.top命令找出最高占用的进程(command为java)该命令具体详细介绍看linux load命令

2.查看高负载进程下的高负载线程:top -Hp 【PID】 (或 ps -mp PID -o THREAD,tid,time)

3.找出最高占用的线程并记录thread_id,把线程号 进行换算成16进制编号:printf ‘0x%x’ thread_id
这里假设存在高占用线程,得到占用cpu最高的线程是:19209
把线程号 19209 进行换算成16进制编号:0x4b09


4.(可选)执行查看高负载的线程名称:jstack 16143【进程】 | grep 3fb6【线程】

jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?

在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x4b89的线程调用栈中,得到这个信息,就可以检查对应的代码是否有问题。

通过thread dump分析线程状态

除了上述的分析,大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等等。

除了上述的分析,大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等等。

在dump中,线程一般存在如下几种状态:详细可以看这篇文章线程的几种状态

1、RUNNABLE,线程处于执行中

2、BLOCKED,线程被阻塞

3、WAITING,线程正在等待

实例1:多线程竞争synchronized锁

很明显:线程1获取到锁,处于RUNNABLE状态,线程2处于BLOCK状态

1、locked <0x000000076bf62208>说明线程1对地址为0x000000076bf62208对象进行了加锁;

2、waiting to lock <0x000000076bf62208>说明线程2在等待地址为0x000000076bf62208对象上的锁;

3、waiting for monitor entry [0x000000001e21f000]说明线程1是通过synchronized关键字进入了监视器的临界区,并处于"Entry Set"队列,等待monitor

## 实例2:通过wait挂起线程

static class Task implements Runnable {@Overridepublic void run() {synchronized (lock) {try {lock.wait();//TimeUnit.SECONDS.sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}}}

dump结果

线程1和2都处于WAITING状态

1、线程1和2都是先locked <0x000000076bf62500>,再waiting on <0x000000076bf62500>,之所以先锁再等同一个对象,是因为wait方法需要先通过synchronized获得该地址对象的monitor;

2、waiting on <0x000000076bf62500>说明线程执行了wait方法之后,释放了monitor,进入到"Wait Set"队列,等待其它线程执行地址为0x000000076bf62500对象的notify方法,并唤醒自己

jastat命令

除了线程以外的堆栈信息,我们还可以通过jstat命令查看内存情况

堆内存 = 年轻代 + 永久代 + 元数据区
年轻代 = Eden区 + 两个Survivor区(From和To)

jstat -gc pid 垃圾回收统计

- S0C:第一个幸存区的大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间

jstat -gcutil pid 总结垃圾回收统计


S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

3、jstat -gcnew pid 新生代垃圾回收统计

- S0C:第一个幸存区大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- TT:对象在新生代存活的次数
- MTT:对象在新生代存活的最大次数
- DSS:期望的幸存区大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间

暂列以上几个,更多可以参考这篇文章jstat命令详解,
最后,内存的溢出往往和gc回收器知识点相关,参考这篇文章gc回收器

CPU过载、内存溢出分析相关推荐

  1. java内存溢出分析工具:jmap使用实战

    java内存溢出分析工具:jmap使用实战 在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap.  1 使用命令  在环境是linux+jdk1.5以上,这个工具是自带的,路 ...

  2. 内存溢出分析之工具篇

    内存溢出分析之工具篇 转载于:https://www.cnblogs.com/lwmp/p/9850446.html

  3. JVM 调优实战--jmap的使用以及内存溢出分析

    目录 jmap的使用以及内存溢出分析 查看内存使用情况 查看内存中对象数量及大小 将内存使用情况dump到文件中 通过jhat对dump文件进行分析 通过MAT工具对dump文件进行分析 MAT介绍 ...

  4. linux环境下内存溢出分析MAT

    文章目录 1 下载及安装mat 1.1 下载地址 1.2 查看服务器版本 1.3 下载安装 2 配置 3 运行 4 分析 1 下载及安装mat 1.1 下载地址 https://www.eclipse ...

  5. Linux下tomcat内存溢出分析及优化

    为什么80%的码农都做不了架构师?>>>    常见的内存溢出有以下两种: java.lang.OutOfMemoryError: PermGen space java.lang.O ...

  6. Java内存溢出分析

    内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题.内存溢出与锁表则不然,一 ...

  7. JVM内存溢出分析-实战JVM(二)

    为什么80%的码农都做不了架构师?>>>    JVM规范规定,除了程序计数器,虚拟机其他内存区域均会发生内存溢出的可能,OutOfMemoryError(OOM) 原文地址:htt ...

  8. 记一次 .NET 医院CIS系统 内存溢出分析

    一:背景 1. 讲故事 前几天有位朋友加wx求助说他的程序最近总是出现内存溢出,很崩溃,如下图: 和这位朋友聊下来,发现他也是搞医疗的,哈哈,.NET 在医疗方面还是很有市场的???????????? ...

  9. POI大量数据读取内存溢出分析及解决方案

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/liangjf85/article/ details/84914798 在使用POI进行excel操作时,当数据量较大时经常会产 ...

  10. java 内存溢出分析_用一段时间后java内存溢出问题分析(转)

    几乎每个月都有出现因为内存溢出的问题,除了需要多分配内存外, 是不是要考虑对代码进行一些处理.. 下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1.尽量在合适的场合使用单例 使 ...

最新文章

  1. 今天感觉有点冷了其实。
  2. Java动态代理代码案例:使用jdk自带的Proxy只能对有接口的类进行动态代理
  3. 删除字符串的前置或者后置空格
  4. android 获取lanucher 列表
  5. 【HTML/CSS】CSS权重、继承及引入方式
  6. Halcon算子学习:XLD几种边缘连接函数
  7. git 安装_Windows系统Git安装教程(详解Git安装过程)
  8. javascript 开发多种类型的应用(Electron 跨平台开发)
  9. C++ string , int 之间相互转换
  10. python100以内奇数累加和_用python脚本来计算100以内奇数或者偶数之和
  11. postman(一)常用的Tests方法
  12. android自定义秒表(精确到0.1秒,带计次功能)
  13. Java---设计【超市商品管理系统】
  14. 最简单代码画的五角星
  15. 关于计算机国考知识点,2020国考申论知识点之了解阅卷人 (有课整理版)
  16. 大众点评评论反爬解决方案
  17. 自制合成孔径雷达(3) doppler代码解读
  18. SSM实现的影院订票系统-JAVA【数据库设计、源码、开题报告】
  19. 电源篇 - 降压电路LDO
  20. xgboost对应python版本下载(win10)

热门文章

  1. 1. 查询表customer——查询姓名和联系人相同的顾客信息
  2. Ubuntu 20.04 创建桌面快捷方式
  3. 制作轮播切换效果html,原生JS实现图片轮播切换效果
  4. 内存分区0x00000000-0x0000FFFF共64K是null指针
  5. PS教程:利用灰度蒙版实现无级调节
  6. 软件沙箱技术 – 安全分析沙箱Cuckoo Sandbox
  7. 计算机学科代表的思维,【判断题】计算思维,是指计算机、软件及计算相关学科中的科学家和工程技术人员的思维模式。计算思维又称构造思维,它以设计和构造为特征, 以计算机学科为代表。...
  8. 案例|工业物联网解决方案•污水处理厂智能监控运维云平台
  9. psd导出切片html 分隔符,PHOTO SHOP里如何能把PSD的自动切成切片?存为HTML格式?
  10. C++:空间坐标映射到球面坐标/全景图