线上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飙高、内存溢出问题分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/best924133514/article/details/129391511
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/661637

相关文章

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Java 中的跨域问题解决方法

《Java中的跨域问题解决方法》跨域问题本质上是浏览器的一种安全机制,与Java本身无关,但Java后端开发者需要理解其来源以便正确解决,下面给大家介绍Java中的跨域问题解决方法,感兴趣的朋友一起... 目录1、Java 中跨域问题的来源1.1. 浏览器同源策略(Same-Origin Policy)1.

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

如何清理MySQL中的binlog问题

《如何清理MySQL中的binlog问题》:本文主要介绍清理MySQL中的binlog问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目http://www.chinasem.cn录清理mysql中的binlog1.查看binlog过期时间2. 修改binlog过期