Java应用无响应、内存飙升、CPU飙升排查

内存飙高问题如何排查? 内存飙高如果发生在java进程上,一般情况是因为创建了大量对象导致,持续飙高说明垃圾回收跟不上对象创建的速度,或者内存泄漏导致对象无法被回收!排查中涉及到如下命令:jstat -gc pid 1000 查看gc情况,时间等信息,每隔一秒打印一次jmap -histo pid | head -20 查看堆内存占用空间最大的钱20个对象类型jmap -dump:live,format=b,file=/home/chenjian/myheapdump.hprof pid 导出堆内存快照。 阅读详情

一、概述

内存飙升:
  • 内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,堆积导致内存溢出。
  • 内存溢出 (out of memory):是指程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中。
CPU飙升:

CPU飙升会导致系统响应缓慢甚至服务不可用。top命令查看cpu,cpu飙升导致服务假死。

内存飙升常见原因:
  • 其他应用(Redis、Kafka)占用总内存;

    解决:top命令排除。

  • 启动参数内存值设定的过小;

    解决:-Xms,-Xmx。

  • 内存中加载的数据量过于庞大(数据缓存、PDF字体缓存、文件传输);

    解决:代码走查,观察内存波动。

  • List、MAP等集合中对对象的引用,使用完后未清空,使得JVM不能回收;

    解决:代码走查,观察内存波动。

  • 代码中存在死循环或循环产生过多重复的对象实体;

    解决:代码走查。

CPU飙升常见原因:
  • 死循环、递归

    消耗CPU。

  • 正则

    消耗CPU。

  • 线程数

    线程数增多,通常会伴随内存飙升,但是线程内本身无复杂业务,会呈现,只有CPU飙升,但内存增高不明显。

  • 死锁

    死锁会导致核心线程数无响应,间接导致线程数飙升。

二、分析思路

内存飙升:
1.排查进程占用内存
  • 使用ps命令查看内存占用情况。
2.分析内存使用情况
  • 使用jstat工具查看Full GC情况,分析full gc次数是否频繁,确认应用本身是否有问题。

  • 使用jmap查看当前应用进程使用内存,分析是否存在内存飙升等问题。

3.排查线程阻塞
  • 使用netstat检查应用的连接数,排除线程阻塞原因。
CPU飙升:

top定位消耗CPU最高进程,jstack找到具体代码位置。

三、实际操作

内存飙升:
1.排查进程占用内存

方法一:

# 第五列为虚拟内存占用情况,第六列为实际内存占用情况,默认单位kb。
ps -aux | grep MyApp.jar
# 实际内存以M为单位
ps -aux | grep MyApp.jar | awk '{sum=$6/1024} {print $0 " " $1 " " sum " MB"}'

方法二:

# 通过ps查找进程id
ps -ef | grep MyApp.jar
# 通过top -p命令查看内存占用
top -p <pid>
2.分析内存使用情况

Java Heap Dump 是特定时刻 JVM 内存中所有对象的快照。它们对于解决内存泄漏问题和分析 Java 应用程序中的内存使用情况非常有用。

Java Heap Dump 通常以二进制格式的 hprof 文件存储。我们可以使用 jhat 或、JVisualVM 、MAT之类的工具打开和分析这些文件。

> Dump快照

1.生成dump快照

  • 自动生成dump快照信息:

    在OOM的时候会自动生成快照信息。

    java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/tmp/heapdump.hprof -jar MyApp.jar
    
  • 手动生成dump快照信息:

    如果启动脚本没有配置dump日志,不要直接停掉应用,手动生成dump日志。JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。

    # 0.查看PID
    ps -aux | grep MyApp.jar
    jps
    ###################################
    # 1.1生成dump日志
    jmap -dump:format=b,file=/tmp/jmap_heapdump.hprof <pid>
    # 1.2生成dump日志(live只保留存活的对象),如果运行时间长,防止heap过大
    jmap -dump:live,format=b,file=/tmp/heapdump.hprof <pid>
    ###################################
    # jcmd是java 8引入的集大成的诊断工具。
    # 使用jcmd生成dump日志
    jcmd <pid> GC.heap_dump /tmp/jcmd_heapdump.hprof
    

2.解析dump日志

  • MAT(免费,解析Dump日志,得出可疑分析报告)

    Memory Analyzer Tool,下载失败,多点几次就行了。Memory Analyzer1.13.0需要jdk11。

    官网地址:https://www.eclipse.org/mat/

  • JProfiler(付费,可试用10天,连接应用直观分析JVM各种变化)
    官网:https://www.ej-technologies.com/download/jprofiler/files
    富贵码:

      # 12.0版本
      L-J12-STALKER#5846458-y8bdm6q8gtr7b#228a 
      L-J12-STALKER#8338547-qywh5933xu2r3#a4a4 
    
  • visualvm(免费)

    官网:https://visualvm.github.io/

    github:https://github.com/oracle/visualvm

> GC日志
  • 启动参数配置生成gc日志:

    java -Xloggc:gc.log -jar MyApp.jar
    
3.排查线程阻塞
检查连接数
netstat -nap | grep <pid>
CPU飙升:
定位消耗CPU最高代码
# 1.找到cpu最高的进程的id
top -c
# 查询java进程前五并进行排序
ps aux|grep java|grep -v grep|head -5|awk '{print $3,$1,$2}'|sort -rn
# 2.打印这个进程的所有线程的运行堆栈
jstack -l <pid> > /tmp/jstack.log
# 3.当前进程所有线程消耗情况
top -H -p <pid>
ps -mp <pid> -o THREAD,tid,time
# 4.找到CPU负载最高的线程, 把线程ID转换成16进制,(10进制转16进制,printf "%x\n" tid)
printf "%x\n" <tid>
# 5.搜索16进制显示的线程ID,定位到具体代码
vim jstack.log
# -A100是日志行数
# jstack <pid>|grep 16进制线程号 -A100

四、GC调优

  • jmap:查看内存信息

    # 查看新生代老年代
    jmap -heap pid
    # 生成dump文件
    jmap -dump:live,format=b,file=/tmp/heapdump.hprof <pid>
    
  • Jstack:进程、线程、堆栈

    # 打印这个进程的所有线程的运行堆栈
    jstack -l <pid>
    # 输出heap的直方图,包括类名,对象数量,对象占用大小
    jmap -histo <pid>
    # 输出堆内存设置和使用情况(JDK11使用jhsdb jmap --heap --pid pid)
    jmap -heap <pid>
    
  • Jinfo:查看jvm的参数

    Jinfo <pid>
    
  • Jstat:堆内存各部分的使用量,以及加载类的数量

    # 输出gc信息,包括gc次数和时间,内存使用状况
    jstat -gc <pid>
    jstat -gcutil <pid>
    
  • Jcmd:从JDK 7开始提供,jcmd拥有jmap的大部分功能,官方推荐使用jcmd命令替代jmap命令。

    # 列出所有的JVM进程
    jcmd -l 
    # 针对指定的进程,列出支持的所有命令
    jcmd <pid> help 
    
线上CPU飙高问题排查 (Java) 线上CPU飙升问题快速定位排查 阅读详情

相关推荐

CPU占用率飙升的排查与优化实战指南

CPU占用率是衡量处理器负载的关键指标,其本质反映的是计算资源的时间分配效率。现代操作系统通过时间片轮转机制管理进程,当某个程序异常占用大量CPU资源时,就会导致系统响应迟滞甚至卡死。从技术原理看,这类似于餐厅厨师超负荷处理订单的场景。常见的诱因包括程序死循环、恶意软件、驱动兼容性问题等。通过任务管理器可以快速定位异常进程,而Process Explorer等工具能进行线程级深度分析。优化方案涵盖电源管理调整、启动项精简、散热维护等层面,对于Chrome浏览器或Java应用等特定场景也有针对性解决方案。掌握

weixin_29305337的博客 313

java程序CPU使用率高可能的原因

在Java并发编程计算密集型要进行大量的计算、逻辑判断等操作,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数,我们设置线程数一般是:计算机核数n+1。计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。

AlbenXie的博客 5288

【线上故障排查】基于Arthas定位Java应用CPU飙高线上故障(面试题 + 3 步追问应对 + 案例分析)

摘要: 某电商平台订单服务在促销期间突发CPU飙高至95%,导致订单提交延迟。通过Arthas工具排查,发现高CPU线程执行processOrder方法时,数据库查询queryOrderItems耗时异常。分析发现SQL语句使用SELECT *且缺乏索引,引发全表扫描。解决方案包括:1)为order_items表添加复合索引;2)优化SQL仅查询必要字段。优化后CPU使用率降至15%,接口响应恢复。案例说明数据库查询效率对CPU资源的影响,需结合索引设计与SQL优化解决性能问题。

博客 1409

Java线上服务CPU、内存飙升问题排查步骤!

如果是Full GC次数过多,那么通过 jstack得到的线程信息会是类似于VM Thread之类的线程,而如果是代码中有比较耗时的计算,那么我们得到的就是一个线程的具体堆栈信息。下面将总结一些具体的排查步骤。首先找到该接口,通过压测工具不断加大访问力度,如果说该接口中有某个位置是比较耗时的,由于我们的访问的频率非常高,那么大多数的线程最终都将阻塞于该阻塞点。这是比较麻烦的一种情况,因为一般来说,其消耗的CPU不多,而且占用的内存也不高,也就是说,我们通过上述两种方式进行排查是无法解决这种问题的。

伤心的辣条 9643

CPU使用率飙升排查实战:从系统监控到代码级性能优化

CPU使用率是衡量系统性能的核心指标之一,它反映了处理器执行指令的繁忙程度。其原理在于操作系统通过时间片轮转调度进程,当应用存在计算密集型任务或资源竞争时,CPU会在用户态和内核态间频繁切换,导致使用率异常升高。理解CPU使用率对于保障系统稳定性和应用性能至关重要,尤其在微服务、容器化等分布式架构中,CPU瓶颈会直接影响服务响应时间和吞吐量。通过监控工具如top/htop进行系统级观测,结合性能剖析工具如perf和async-profiler进行代码级热点分析,可以精准定位性能瓶颈。本文以Java应用为例,

weixin_32050773的博客 222

Java性能调优实战:VisualVM从入门到精通,一站式解决内存泄漏与CPU瓶颈

在Java应用性能监控与调优领域,JMX(Java Management Extensions)是标准的管理和监控框架,它允许开发者通过MBean暴露应用的运行时状态。其核心原理是基于代理模式,JVM通过内置的MBean服务器收集性能数据,如内存使用、线程状态和类加载信息。这项技术的价值在于为分布式环境下的Java应用提供了统一的监控接口,是构建APM(应用性能管理)系统的基础。在实际工程实践中,开发者和运维人员常借助图形化工具来可视化这些数据,以便快速定位性能瓶颈,例如CPU使用率异常、内存泄漏或线程死锁

weixin_33725515的博客 657

CPU内存飙升

CPU 飙升是指中央处理器(CPU)的使用率在短时间内急剧上升,达到一个较高的水平。正常情况下,CPU 会根据系统和应用程序的需求合理分配资源,使用率会在一定范围内波动。但当 CPU 飙升时,可能会导致系统整体性能下降,出现诸如系统响应迟缓、应用程序卡顿甚至无响应等问题。例如,在一个服务器环境中,如果 CPU 使用率长时间处于高位,可能会影响该服务器上运行的所有服务,导致网站访问速度变慢、数据库查询延迟等情况。

qq_62097431的博客 1337

服务器不稳定排查指南:从CPU、内存到网络的系统化定位方法

在运维和开发实践中,服务器负载异常、接口偶发超时、系统重启后短暂恢复等现象,往往比彻底宕机更难定位。这类不稳定状态通常源于CPU平均负载过高、内存耗尽触发OOM、磁盘IO阻塞或网络TCP重传等多维度资源竞争。理解Linux系统的核心指标原理,例如区分平均负载与CPU使用率、识别内存available字段的真实含义、解析inode与磁盘容量的关系,是高效排查的基础。掌握这些技术价值在于,当云服务器或容器环境出现性能抖动时,能够从监控数据入手,沿着系统层到应用层的路径快速缩小问题范围。无论是物理机、虚拟机还是容

weixin_34375251的博客 388

Java 常见线上故障排查方案详解

Java 线上故障排查需结合监控(Prometheus)、诊断(Arthas、jstack)、日志(ELK)和代码优化。常见故障包括内存溢出、CPU 飙升、慢查询、死锁、GC 频繁和连接池耗尽,需系统化流程和工具链应对。电商案例验证了 P99 延迟 3ms、QPS 12 万、恢复时间 5 分钟的效果。监控诊断优化:JVM 参数 + 代码规范。演练:Chaos Mesh 模拟故障。故障排查是保障高可用性的关键,未来将在 AI 和云原生方向演进。

lssffy的博客 1963

服务器CPU飙升至100%?数据库连接池被打满?一次生产事故的完整排查与系统加固复盘

服务器资源耗尽、CPU飙升、数据库连接池被打满,是互联网后端最典型的故障场景之一。当突发流量叠加低效SQL与同步接口设计缺陷,单点服务很容易陷入雪崩。本文从资源耗尽的基本原理出发,梳理从系统负载查看、数据库连接状态分析到慢SQL定位的排查链路,并给出Nginx限流、Redis缓存、连接池调优、异步化改造以及读写分离等系统加固方案。无论你是运维新手还是开发老兵,都能从中收获一套可复用的服务器故障排查与高可用架构设计经验,提前为下一次“黑子”上线穿上防弹衣。

weixin_34354173的博客 415

Java进程内存占用过高,排查解决方法

Java进程内存占用过高是一个常见的问题,但通过检查内存泄漏、优化对象的创建和销毁以及调整JVM内存参数,我们可以有效地解决这个问题。本文将介绍一些常见的排查和解决方法,帮助您解决Java进程内存占用过高的问题。Java应用程序运行在Java虚拟机(JVM)中,可以通过调整JVM的内存参数来限制Java进程的内存占用。通过优化对象的创建和销毁,可以有效减少内存占用,提升Java应用程序的性能和稳定性。a. 使用对象池:通过对象池可以重用已经创建的对象,减少对象的创建和销毁次数。优化对象的创建和销毁。

CyberWizarDD的博客 8259

Java线上异常排查实战:OOM、CPU飙升与JVM工具链详解

线上Java系统故障中,OOM和CPU飙升是最常见也最棘手的两类问题。理解JVM内存模型、GC机制与线程调度原理,是精准定位故障的前提。通过HeapDumpOnOutOfMemoryError等参数提前保留现场,配合jstat观察GC趋势、jmap抓取堆转储、jstack分析线程栈,再借助Arthas在线观测方法耗时与调用参数,能高效锁定内存泄漏、死循环或正则回溯等根因。这些技术不仅面试高频,更在日常服务稳定性保障中发挥关键价值。本文从异常分类与识别入手,完整演示从告警到定位的排查链路,帮助你建立一套不慌不

weixin_33563728的博客 151

避坑指南:PyCINRAD处理CINRAD雷达数据时遇到的5个典型报错及解决方案

本文针对使用PyCINRAD库处理CINRAD雷达基数据时常见的5个典型报错,提供了详细的解决方案。内容涵盖环境配置、数据读取、PPI可视化及性能优化等核心环节,重点解决了版本兼容性、数据异常处理和中文乱码等实际问题,帮助用户高效处理雷达基数据并生成准确的PPI图像。

cc789的博客 1068

Java服务CPU与内存过高问题排查实战指南

在Java应用性能优化领域,CPU使用率过高和内存泄漏是两大核心挑战,直接影响服务稳定性和响应效率。其原理通常涉及线程调度、垃圾回收机制与对象生命周期管理。深入理解这些底层机制,对于构建高可用系统具有重要技术价值。在实际应用场景中,无论是电商秒杀、实时数据处理还是微服务架构,不当的线程同步、未关闭的资源引用或缓存策略失效都可能导致资源异常消耗。本文聚焦于Java服务性能诊断,系统介绍如何利用jstack、MAT等工具链,结合火焰图与堆转储分析,快速定位死循环、内存泄漏等线上问题,提升工程团队的问题排查与解决

weixin_33721427的博客 447

高性能网站设计之缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。 我不知道为什么这么多人用的都是这

代码技巧 1万+

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集,数据显示及matlab操作界面。

qq_41958946的博客 7355

Java线上故障排查手册:从CPU飙升到内存泄漏的完整流程

线上系统一旦出现CPU飙升、接口超时、内存上涨或频繁Full GC,很多团队常陷入“重启—查日志—问DBA—看监控”的循环,却始终找不到根因。这并非能力不足,而是缺少一套可复用的排查顺序。理解线程栈、堆转储、GC日志等核心概念,掌握从系统负载到JVM内部状态的分层排查路径,是快速定位问题的关键。通过jstack、jstat、jmap等工具采集现场证据,再结合数据库慢查询与连接池监控,能有效缩短故障恢复时间。本文面向Java后端开发者、运维及SRE人员,提供从现象分类到模拟案例的完整操作流程,帮助你建立“先整

weixin_32247165的博客 278

C++ 图像线特征提取(CannyLine算法+opencv3.4.6)

C++ 图像线特征提取(CannyLine算法+opencv3.4.6)

weixin_43896283的博客 1084

Java线程诊断利器jstack:从原理到实战,快速定位死锁与CPU飙升

在Java应用性能调优与故障排查中,线程状态分析是诊断线上问题的核心技术。理解线程的生命周期及其状态(如RUNNABLE、BLOCKED、WAITING)是分析锁竞争、资源等待等并发问题的关键。通过线程堆栈快照,可以透视应用在特定时刻的执行路径,精准定位到代码行级瓶颈。这一技术对于保障高并发系统的稳定性和性能至关重要,尤其在微服务架构下,能有效诊断接口超时、服务无响应等典型问题。本文以jstack工具为例,深入解析其抓取线程快照的原理,并结合死锁、CPU占用率100%等高频线上故障场景,演示如何通过线程堆栈

weixin_30596023的博客 388

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)。

非科班Java出身GISer的博客 709

【实战教程】OpenClaw接入MySQL数据库实战指南

本文介绍了在虚拟机Ubuntu中访问宿主机Win11中MySQL数据库的配置方法,重点包括创建远程用户、权限配置和安全设置。首先在MySQL中创建具有只读权限的用户并刷新权限,然后调整服务器设置允许远程连接。文章还提供了某金融机构财富管理系统的数据库设计方案,包含理财产品表、客户表和份额表的核心结构,其中金额字段使用DECIMAL类型确保精度,并设置唯一键约束。文末强调测试环境配置完成后应恢复安全更新模式以保障生产环境安全。

海兰 8700

生产问题排查之---cpu飙升

什么是线程堆栈 Java线程堆栈是虚拟机中线程(包括锁)状态的一个瞬间快照,即 系统在某个时刻所有线程的运行状态。 包括每一个线程的调用堆栈,锁的持有情况等信息,从线程堆栈中可以得到以下信息: 线程的名字,ID,线程的数量等; 线程的运行状态,锁的状态(锁被那个线程持有,哪个线程在等待锁等); 函数间的调用关系,包括完整类名,所执行的方法,源代码的行数等; 可以通过Jstack获取应用运行时的线程堆栈,可以通过如下方式获取线程堆栈: jstack pid>>

qaws9403的博客 308

YOLO创新点改进点的消融实验设计规范

YOLO改进的消融实验是一种重要的方法,用于评估和验证模型中不同组件的影响。在进行YOLO改进的消融实验时,我们可以选择一些可能的改进点,比如Backbone网络、Anchor框设计和损失函数设计,然后通过实验来分析它们对模型性能的影响。首先,我们需要确定实验设计。对于每个改进点,我们将设计多个实验组,并针对每个实验组训练模型并进行性能评估。这里以三个改进点为例进行说明:改进点1:Backbone网络 (改进点2:Anchor框设计 (改进点3:损失函数设计 (

crasher123的博客 2909

linux基础命令

查看指定ip的延迟丢包率18 packets transmitted:发送了18个数据包。18 received:收到了18个回复数据包。0% packet loss:丢包率为0%,表示所有发送的数据包都成功到达目的地。time 34038ms:ping命令的运行时间为34038毫秒(34.038秒)。rtt:表示往返时间(Round-Trip Time),即从发送数据包到接收回复数据包所花费的时间。min/avg/max/mdev:分别表示最小、平均、最大和平均偏差的往返时间。

l6xy6的博客 2179

(四)C++自制植物大战僵尸游戏启动流程

鼠标左键单机VS2022上方工具栏中进行项目启动。第一次启动项目需要编译项目中所有代码文件,编译生成需要一定的时间。不同性能的电脑需要消耗的时间差别可能较大,通常在几分钟到几十分钟之间。编译成功后会自动启动运行游戏。qi编译成功后自动启动运行游戏如下图。

尔灵尔亿的博客 2466

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java开发十大常见问题与场景排查指南(实战总结)

应用运行时间越长,内存占用持续增长Full GC频繁但回收效果差最终触发工具链监控体系编码规范:防御性编程+资源管理TIP:复杂问题可使用让JVM自动生成Dump文件如需扩展某个场景的细节,欢迎留言讨论!

weixin_62922042的博客 1789

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: Nginx主动健康检查实现业务平滑转移
下一篇: Redis基础运维及问题排查
码上富贵
博客等级 码龄17年 1万+粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值