线上CPU飙高、内存溢出问题分析

2024-01-30 21:40

本文主要是介绍线上CPU飙高、内存溢出问题分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线上CPU飙高、内存溢出问题分析

  • 前言
  • CPU飙高
    • 使用命令jstack
    • 使用Arthas工具
    • 下载Arthas
  • 内存溢出
    • 使用jmap导出内存快照
    • 一般是设置jvm参数自动生成dump文件
    • 使用jvisualvm
    • 使用MAT工具

前言

在生产环境,可能会出现CPU飙高,或者内存溢出的情况,造成系统卡顿甚至崩溃,怎样快速定位到问题代码,下面介绍几种方法。

CPU飙高

查看CPU飙高有使用jstack命令及Arthas工具,怎么使用,模拟CPU飙高案例。

public class CPUHighTest {public static void main(String[] args){new Thread(() -> {while (true) {}}).start();}
}

编译:javac CPUHighTest.java,生成class文件
运行:java CPUHighTest
如果运行报错:Error:Could not find or load main class Arthas
需要更改profile文件,在$JAVA_HOME前加.:

CLASSPATH=.:$JAVA_HOME/lib/

使用命令jstack

  1. 使用top -p pid为进程号,现在进行占用CPU情况。
    在这里插入图片描述
  2. 输入H,显示每个线程占用情况。
    在这里插入图片描述
  3. 找出占用CPU最高的线程ID为1739613
  4. 需要将线程ID转为十六进制,1a8b5d
  5. 使用命令jstack 1739598|grep -A 10 1a8b5d
    在这里插入图片描述
    迅速定位到问题代码。

使用Arthas工具

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

下载Arthas

https://github.com/alibaba/arthas/releases
下载成功后,解压,启动Arthas

java -jar arthas-boot.jar

在这里插入图片描述
选择相应的进程,进入arthas
输入dashboard查看概况,发现有CPU占用高的进程
在这里插入图片描述
输入thread <进程id>,本例中为9,迅速定位到问题代码
在这里插入图片描述

内存溢出

模拟内存溢出

public class OOMTest{public static void main(String[] args) {List<Object> list = new ArrayList<>();int i = 0;int j = 0;while (true) {list.add(new User(i++, UUID.randomUUID().toString()));new User(j--, UUID.randomUUID().toString());}}private static class User {public User(int i, String s) {}}
}

编译:javac OOMTest.java,生成class文件
运行:设置jvm参数,将堆内存设小一点,方便模拟内存溢出,java -Xms10M -Xmx10M OOMTest

使用jmap导出内存快照

jmap -dump:format=b,file=jvm.hprof 1777262

一般是设置jvm参数自动生成dump文件

java -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/jvm.hprof OOMTest

使用工具分析dump日志

使用jvisualvm

java自带的分析工具,在java的bin目录下
在这里插入图片描述
启动成功导入jvm.hprof文件
在这里插入图片描述

一般dump文件会比较大,导入jvisualvm时会比较慢,有时会提示内存不足,需要设置jvisualvm启动参数:visualvm_default_options
配置文件位置:JDK路径/lib/visualvm/etc/visualvm.conf

在这里插入图片描述
如果电脑内存允许的话,尽可能设置大点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
迅速定位到问题代码

使用MAT工具

下载安装
下载地址:https://www.eclipse.org/mat/downloads.php
下载成功后解压,双击MemoryAnalyzer.exe启动
在这里插入图片描述
如果本地jdk版本不是11以上,启动过程中可能会报JDK版本问题
在这里插入图片描述
这时需要在MemoryAnalyzer.ini中添加参数,设置本地JDK

-vm
C:\Program Files\Java\jdk-11.0.16\bin\javaw.exe

在这里插入图片描述
启动成功后导入dump文件
file->open heap dump
通过Histogram查看实例占用情况
在这里插入图片描述
查看thread_overview
在这里插入图片描述
选择占用最高的thread->右键->Thread Details
在这里插入图片描述
可迅速找出问题代码。

这篇关于线上CPU飙高、内存溢出问题分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/661637

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har