本文转载 线上应用故障排查之一:高CPU占用 DBA+社群(dbaplus)丁启良

1. 应用程序占用资源高问题

目前大部分应用程序采用的是JAVA语言开发,在产品上线使用一段时间后,经常会出现某个JAVA程序占用的CPU,内存过高,而且几乎从不释放,导致系统卡顿,用户使用变慢,如果要恢复,则必须杀掉该进程或重启该服务,然后进行此操作时,必定会导致业务中断。

程序主要由代码组成,优化则需要知道是哪段代码占用资源,并且一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环,所以通过优化代码来降低应用程序的资源消耗或者在应用的使用过程中减少死循环则必不可少。

2. 问题分析

2.1. CPU过高分析

1)使用TOP命令查看CPU、内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比。其中CPU状态中标示id的为空闲CPU百分比。当空闲CPU百分比越低,说明CPU占用率越高。

2)初步分析可以发现其中主要占用CPU的进程为java子进程jerrySsh服务(用户访问资源使用的监听服务),在用户量不大的情况下,CPU消耗资源很大。根据研发反馈字符网关设定的最大访问量可达到500/台,目前字符网关的资源使用现状无法满足设定的要求。

● 分析手段

目前针对Linux下java进程占用CPU高的分析手段主要为使用linux命令查出高CPU使用的进程,前分析其是由于进程原因还是系统原因,在分析出为进程消耗过高CPU后列出占用CPU高和占用时间最长的线程并使用jdk自带的jstack工具进行分析CPU使用分析

分析过程:

  1. 根据top命令,发现PID为13033的Java进程占用CPU %id 50%以上,占用CPU过高

  2. 找到该进程后,首先显示线程列表,并按照CPU占用高的线程排序,命令为:ps mp 13033 -o THREAD,tid,time|sort -rn -k 2

  3. 找到了耗时最高的线程28358,占用CPU时间达8分多钟。将需要的线程ID转换为16进制格式,命令为:printf "%x\n" 28358 例如为:b0d

  4. 最后打印线程的堆栈信息:jstack 2829|grep b0d -A 30

2.2. 内存使用分析

在linux的内存分配机制中,系统优先使用物理内存,当物理内存还有空闲,表示还够用时,不会释放其占用内存,即使占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快,因此查看目前进程正在实际被使用的内存(used-buffers-cache),也可以认为如果交换分区(swap)没有大量使用,物理内存(mem)还是够用的,只有物理内存(mem)被当前进程实际占用完(没有了buffers和cache),才会使用到交换分区(swap)。

但是从代码的角度,目前研发人员主要关注java.lang.OutOfMemoryError: Java heap space异常,减少不必要的对象创建,同时避免内存泄漏,所以分析代码才是我们接下来要做的主要工作;以下为字符网关分析内存占用的故障排查过程:

● 分析手段

  1. top命令:Linux命令。可以查看实时的内存使用情况。

  2. jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。

  3. jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏。

3. 总结分析手段

● 分析CPU占用的方法和手段:

  1. top命令:可以查看实时的CPU使用情况。

  2. ps -ef命令:可以查看进程以及进程中线程的当前CPU使用情况以及属于当前状态的采样数据。

  3. jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。

  4. pstack:Linux命令。可以查看某个进程的当前线程栈运行情况

● 分析内存性能的方法和技巧:

  1. top命令:可以查看实时的内存使用情况。

  2. jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。

  3. jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏等等。

转载于:https://www.cnblogs.com/zwh-Seeking/articles/11157399.html

LINUX类主机JAVA应用程序占用CPU、内存过高分析手段相关推荐

  1. Linux Shell脚本专栏_找出占用CPU/内存过高的进程_05

    文章目录 找出占用CPU/内存过高的进程 1. 脚本 2. 运行脚本 3. 效果图 找出占用CPU/内存过高的进程 1. CPU 过高的进程2. 内存 过高的进程 1. 脚本 #/bin/bash e ...

  2. python进程占用cpu过高_找出占用cpu内存过高的进程

    找出占用cpu内存过高的进程 准备 //分析占用CPU最高的应用 [root@dy1 ~]# ps -eo user,pid,pcpu,pmem,args --sort=-pcpu |head -n ...

  3. Java 应用程序的 CPU 使用率飙升原因分析

    一. 问题 while 的无限循环是否会导致 CPU 使用率飙升? 频繁的 Young GC 是否会导致 CPU 使用率飙升? 有大量线程的应用程序的 CPU 使用率高吗? CPU 使用率高的应用程序 ...

  4. java 进程占用系统内存过高分析

    JVM的内存 先放一张JVM的内存划分图,总体上可以分为堆和非堆(粗略划分,基于java8) 那么一个Java进程最大占用的物理内存为: Max Memory = eden + survivor + ...

  5. Java占Linux超过xms,linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  6. linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  7. Java程序占用 CPU 过高怎么排查

    Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅 ...

  8. weblogic占用java_weblogic下java程序占用cpu过高的问题排查

    1.cpu使用情况如图: 2.执行命令 :jstack 126624 > cpu1112.log   (注意执行此命令时的用户需为执行进程的用户,所以此处需要用weblogic用户) 若执行此命 ...

  9. weblogic下java程序占用cpu过高的问题排查

    1.cpu使用情况如图: 2.执行命令 :jstack 126624 > cpu1112.log   (注意执行此命令时的用户需为执行进程的用户,所以此处需要用weblogic用户) 若执行此命 ...

最新文章

  1. Unity 之事件系统
  2. qemu核心机制分析-协程coroutine
  3. leetcode 41. First Missing Positive 1
  4. java asm tree_使用ASM 4处理Java类文件–第二部分:Tree API
  5. Please use boost/bind/bind.hpp + using namespace boost::placeholders
  6. Pycharm中设置py文件头部注释信息
  7. 苹果员工号召罢工 呼吁顾客平安夜不购买苹果产品
  8. php 判断当前协议,JavaScript 判断当前协议是http还是https
  9. Java并发编程基础-锁-synchronized状态变换
  10. win10设置vmware 虚拟机开机自启动
  11. 中国电信5G技术无线频率
  12. MapStruct一个代码的装潢师
  13. 第三方支付架构设计之—帐户体系
  14. 2019年京东面试题-洗咖啡杯问题【贪心和动态规划】
  15. 金额转大写java实现
  16. 第二周——学习内存取证神器volatility的使用
  17. 在职上班族怎么报考成人大专?成人大专有哪些条件?
  18. 领先招聘和支付平台Deel筹资1.56亿美元,成为独角兽企业
  19. PXC 避免加入集群时发生SST
  20. 嵌入式新闻早班车-第5期

热门文章

  1. 物联网卡对企业设备的重要性
  2. C语言实现二叉树的各种遍历及求解深度
  3. tensorflow 入门笔记(二)
  4. 月历1997年php代码_php自动生成月历的代码
  5. android groovy方法,Android Gradle从入门到精通(三)Groovy快速入门指南
  6. [tensorflow]tensorflow 顺序模型(Sequential model)
  7. React Native在Android当中实践(一)——背景介绍
  8. 用c语言对文件读取,并使用链表,和顺序表进行存储,操作
  9. 聊聊spring for kafka对consumer的封装与集成
  10. 物联网平台之争 巨头竞合并存