CPU、内存占用率高排查

news2024/12/23 12:46:40

CPU高占用

排查思路

  1. top 命令查看CPU占用率高的进程
  2. top -H -p ${pid} 命令查看具体是进程的哪个线程占用CPU
  3. printf ‘%x\n’ ${pid} 将线程的pid转为16进制
  4. jstack ${十六进制pid} | grep -A 20 查看线程的基本信息与方法调用栈

模拟排查

[root@VM-24-5-centos www]# top
top - 15:39:55 up 69 days, 13:43,  2 users,  load average: 3.10, 1.75, 0.93
Tasks: 110 total,   1 running, 109 sleeping,   0 stopped,   0 zombie
%Cpu(s): 50.5 us,  0.5 sy,  0.0 ni, 49.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1881840 total,   100232 free,   829564 used,   952044 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   862992 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
27145 root      20   0 2750780  23504  11488 S  99.7  1.2   1:33.06 java
 6493 root      20   0 1033692  51588  16660 S   0.3  2.7 121:18.66 YDService
13842 root      20   0  680292  14520   2464 S   0.3  0.8  10:39.63 barad_agent

PID为27145的java进程占用CPU较多

[root@VM-24-5-centos www]# top -H -p 27145
top - 15:41:10 up 69 days, 13:44,  2 users,  load average: 1.60, 1.58, 0.93
Threads:  13 total,   1 running,  12 sleeping,   0 stopped,   0 zombie
%Cpu(s): 50.3 us,  0.2 sy,  0.0 ni, 49.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1881840 total,   103628 free,   826112 used,   952100 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   866456 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
27157 root      20   0 2750780  23504  11488 R 99.7  1.2   2:47.67 java
27145 root      20   0 2750780  23504  11488 S  0.0  1.2   0:00.00 java
27146 root      20   0 2750780  23504  11488 S  0.0  1.2   0:00.10 java

PID为27145的java进程的PID为27157的子线程占用CPU较多

[root@VM-24-5-centos www]# jstack 27145 | grep 0x6a15 -A 20
"Business Thread" #8 prio=5 os_prio=0 tid=0x00007f545c102000 nid=0x6a15 runnable [0x00007f544c6f5000]
   java.lang.Thread.State: RUNNABLE
	at CPUOccupancyRateTest.lambda$businessThread$0(CPUOccupancyRateTest.java:10)
	at CPUOccupancyRateTest$$Lambda$1/834600351.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:748)

"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00007f545c0b9000 nid=0x6a13 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f545c0b6000 nid=0x6a12 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f545c0b3000 nid=0x6a11 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007f545c0b1800 nid=0x6a10 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f545c07e800 nid=0x6a0f in Object.wait() [0x00007f544ccfb000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
[root@VM-24-5-centos www]#

将线程的PID转为16进制后,通过jstack该线程的信息与方法调用栈,该线程的名称为: Business Thread,可定位到执行代码:CPUOccupancyRateTest.java:10。看下具体java代码:

public class CPUOccupancyRateTest {

    public static void main(String[] args) {
        businessThread();
    }

    static void businessThread() {
        Thread thread = new Thread(() -> {
            while (true) {  // line 10
                // Do nothing
            }
        });
        thread.setName("Business Thread");
        thread.start();
    }
}

内存高占用(使用MAT分析)

排查思路

若仍未发生OOM:

  1. top 命令查看Memeory占用率高的java进程
  2. jmap dump java进程的内存快照文件
  3. 通过可视化分析工具导入快照文件进行排查
    3.1. 占用内存过多的对象是哪些
    3.2. 这些对象被谁引用
    3.3. 定位到具体代码

注:若堆内存很大时,直接在线上服务器执行 jmap dump 内存快照文件,会导致长时间STW来导出很大的快照文件,引发服务程序不可用。

若发生了OOM,通过配置的JVM启动参数:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${path}

找到快照文件,导入到可视化分析工具中分析。

OOM模拟排查

JVM启动参数

-Xmx10m -Xms10m 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/Users/congqingquan/Desktop

测试代码

public class OOMTest {

    public static void main(String[] args) {
        oomTest();
    }

    static void oomTest() {
        Thread thread = new Thread(() -> {
            List<Person> list = new ArrayList<>();
            while (true) {
                list.add(new Person());
            }
        });

        thread.setName("OOM Test Thread");
        thread.start();
    }

    static class Person {}
}

使用MAT引入快照文件进行分析

MAT下载地址,红、黄框为常用的分析功能

在这里插入图片描述

Histogram

类的实例对象的柱状统计分析图

在这里插入图片描述

默认以Byte为单位展示数据,若需要更改显示单位可以在:
Preferences -> Memory Analyzer -> Bytes Display 中选择,一般使用Smart选项。

字段解释:

  1. Objects:实例对象的数量
  2. Shallow Heap:实例对象占用的内存大小(仅单纯的将每个实例的大小相加汇总)
  3. Retained Heap:实例对象若都可以被回收,那么可以被GC释放的内存大小(不仅需要考虑每个实例本身的大小,也会计算实例成员属性指向的实例的大小)

Dominator_tree

在这里插入图片描述

Dominator Tree(支配树)视图,列出了每个对象实例的引用关系的树状图,包含了占用内存的大小和百分比。

字段解释:

  1. Shallow Heap:实例对象占用的内存大小(仅单纯的将每个实例的大小相加汇总)
  2. Retained Heap:实例对象若都可以被回收,那么可以被GC释放的内存大小(不仅需要考虑每个实例本身的大小,也会计算实例成员属性指向的实例的大小)
  3. Percentage:占用堆内存的百分比

Thread_overview

在这里插入图片描述

线程概述:程序中所有的线程的信息,如:方法调用栈,方法的栈帧,每个线程、方法中创建的对象以及占用堆内存大小。

字段解释:

  1. Name:线程名称
  2. Shallow Heap:实例对象占用的内存大小(仅单纯的将每个实例的大小相加汇总)
  3. Retained Heap:实例对象若都可以被回收,那么可以被GC释放的内存大小(不仅需要考虑每个实例本身的大小,也会计算实例成员属性指向的实例的大小)
  4. Context Class Loader:上下文类加载器
  5. Is Daemon:是否为守护线程

回顾排查思路中的第三步,使用排查工具分析:

  1. 占用内存过多的对象是哪些?Histogram,可以直观的看到统计数据
  2. 这些对象被谁引用?Dominator_tree,从根对象角度,根据Retained Heap排序,查看哪个GC Root对象的引用关系树中存在的对象占用内存过大
  3. 定位到具体代码?Thread_overview,从线程角度,根据Retained Heap排序,查看哪个线程生成的对象占用内存过多,分布在线程的哪些方法中。

由于案例比较简单,通过MAT常用功能的讲解,已经可以在解释截图中看到问题根源了:

  1. Histogram 视图说明了占用内存过多的对象:Person。
  2. Thread_overview 视图说明了这些对象主要集中在OOM Test Thread线程中。通过线程的方法调用栈,可以看到问题出在oomTest方法上,因为方法内的某个lambda表达式中的一个局部变量ArrayList对象存储了大量的数据。截图中我并没有展开,里面存储的正是大量的Person实例。

Leak Suspects

在这里插入图片描述

泄漏疑点:MAT会根据快照文件帮助你分析,并列出分析后的可疑点。点击Detail有更具体的详细说明,非常好用~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue可视化管理工具创建项目报错解决errno: -4058;连接超时

vue可视化管理工具创建项目报错解决errno: -4058 简介&#xff1a;vue创建项目时&#xff0c;errno&#xff1a;-4058问题解决&#xff0c;使用vue ui指令时会报连接超时问题解决。 基础材料&#xff1a; 使用的node.js版本&#xff1a;18.12.1 vue版本&#xff1a;4.5.15…

【shell脚本】监控磁盘/内存使用率·检测域名是否正常·一键部署LMNP·拉黑攻击服务器的异常ip

文章目录1、监控2台服务器硬盘利用率脚本实战2、批量检查 5个网站域名是否正常3、统计磁盘使用率&#xff0c;磁盘大于%5 就打印mail 小于 硬盘正常 内存也是一样4、有人攻击我服务器 就拉黑异常ip5、使用for循环安装 批量安装3台服务器 php环境 使用&#xff08;LAMP&#xff…

Web前端开发技术课程大作业:简单的网页制作期末作业——狐妖小红娘(6页)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

PM说 | 如何精准的获取用户需求?需求分析到底分析什么?

如何精准获取用户需求&#xff1f;怎么做好需求分析? 文章目录如何精准获取用户需求&#xff1f;怎么做好需求分析?前言一、用户的正在需求是什么二、如何精准的获取用户需求三、实操项目分析四、需求分析的方法总结前言 不知你是否曾遇到这样的处境&#xff0c;听到需求&am…

多线程~实现多线程

实现多线程 进程&#xff1a;是正在运行的程序 是系统进行资源分配和调用的独立单位每一个进程都有它自己的内存空间和系统资源 线程&#xff1a;是进程中的单个顺序控制流&#xff0c;是一条执行路径 单线程&#xff1a;一个进程如果只有一条执行路径&#xff0c;则称为单…

小游戏开发指南及过程中的难点问题

如果仅仅针对个人开发者来讲&#xff0c;要独立开发一款大型游戏几乎无可能&#xff0c;更大成功的可能还是开发一款类似《羊了个羊》这样洗脑的小程序游戏。 所以这里主要论述小游戏开发的情况&#xff0c;也就是小程序游戏&#xff0c;首先从小游戏的开发流程来看&#xff1…

chatGPT:12.12 之后更新的 chatGPT 的本地部署和接口调用,解决 response 403 (无法连接openai服务器)问题

文章目录问题源代码改动Session token 的获取cf_clearance 的获取user-agent 的获取将 config.json.sample 内容修改并移动位置附注&#xff1a;环境配置python > 3.7特别提示playwright & cf_clearancerevChatGPT 版本httpxOpenAIAuth删除 import 中的错误后记问题 因…

web网页设计期末课程大作业:基于HTML+CSS+JavaScript个人书画作品展示HTML模板(6页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Matlab论文插图绘制模板第69期—带误差棒的折线图(Errorbar)

在之前的文章中&#xff0c;分享了一系列Matlab折线图的绘制模板&#xff1a; 这一次&#xff0c;再来分享一种特殊的折线图&#xff1a;带误差棒的折线图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matl…

C语言判断一个整数是不是素数(质数)、求100以内的所有素数、求前50个素数

目录 一.什么是素数&#xff08;质数 Prime&#xff09; 二.判断一个整数是不是素数&#xff08;质数&#xff09;代码 三.求100以内的所有素数&#xff08;质数&#xff09; 四.输出前50个素数&#xff08;质数&#xff09; 一.什么是素数&#xff08;质数 Prime&#xff0…

5、metasploit信息搜集

一、概念 针对目标在开放端口、以及运行的服务进行探测。portscan端口扫描mysql安全测试服务版本确定密码嗅探SNMP探测二、metasploit中信息搜集模块 2.1、use auxiliary/gather/ 与 use auxiliary/scanner/ 2.2、针对SMB版本探测&#xff08;默认445端口&#xff09; 也可以探…

vTESTstudio入门到精通 - CANoe工程导入vTESTstudio_02

前面我们已经讲完了如何配置出来一个vTESTstudio工程,并且编译成一个可执行的文件,接下来我们就是要把这块可执行文件导入到CANoe中,通过CANoe工程来执行我们编译的脚本,实现对应功能的测试,今天就是给大家分享如何导入。 二、CANoe工程导入vTESTstudio执行文件 1、创建一…

猿如意中的【blender】工具详情介绍

文章目录一、工具名称二、下载安装渠道2.1 什么是猿如意&#xff1f;2.2 如何下载猿如意&#xff1f;三、工具介绍四、blender介绍4.1 blender简介4.2 背景4.3 主要功能五、软件安装过程5.1 如何在猿如意中下载开发工具blender&#xff1f;5.2 下载blender软件截图5.3 blender安…

基于51单片机的数字电压表设计

程序运行图&#xff1a; 仿真原理图&#xff1a; 部分程序&#xff1a; #define LED_GLOBAL 1 #include "led.h" void ledDelay(uint ms) { uchar delayi; while(--ms) { for(delayi0;delayi<124;delayi); } } void init_led(void) { LEDsegLedCode[0]; L…

四、JavaScript——基本语法

1.注释 <script>/*1.多行注释*///2. 单行注释</script> 2.大小写 JS严格区分大小写 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

Web前端105天-day42-JSCORE

JSCORE02 目录 前言 一、复习 二、函数在对象中触发方式 2.1.call 2.2.apply 2.3.bind 三、引用类型 四、构造函数 五、new 六、原型理念 ​七、原型 八、class 九、严格模式 十、ES6 十一、let与const 总结 前言 JSCORE02学习开始 一、复习 JS引擎具有自动修…

操作系统学习笔记_4 文件;磁盘

文件 有信息的数据集合。 文件包含的信息&#xff1a;文件名、标识符&#xff08;操作系统要看&#xff09;、类型、大小、创建修改时间、所有者、安全信息。 文件管理 文件分为无结构的流式文件和有结构的记录式文件。记录式文件由一条条记录组成。 文件存放在根目录里的…

DFGN-Dynamically Fused Graph Network for Multi-hop Reasoning 论文阅读

文章目录介绍相关工作text-based QA多跳QA推理模型段落选择器构建实体图编码 Query 和 ContextFusion Block 推理Doc2GraphDynamic Graph AttentionUpdate QueryGraph2Doc预测介绍 将 DFGN 模型用于HotpotQA &#xff08;TBQA类型的公开数据集&#xff09; QA任务注重从单一的…

ADI Blackfin DSP处理器-BF533的开发详解46:图像处理专题-Translation (图像平移处理)(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像平移处理&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"路径中的 tes…

【爬虫实战项目】Python爬取Top100电影榜单数据并保存csv文件(附源码)

前言 今天给大家介绍的是Python爬取Top100电影榜单数据保存csv文件&#xff0c;在这里给需要的小伙伴们代码&#xff0c;并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫&#xff0c;基本的是加请求头&#xff0c;但是这样的纯文本数据爬取的…