如何定位生产环境中的问题(Java)

记1次生产环境java进程内存泄漏问题定位(使用Arthas) 记1次生产环境Java内存泄漏问题定位(使用Arthas),堆外内存溢出; 阅读详情

前言

相信大家在平时工作中,或多或少遇到过些棘手的问题,如CPU负载过高、内存溢出、频繁Full GC等。对刚接触工作的同学来说的确是不知道从哪入手,所以这里我简单介绍一下上面三种问题该如何去定位以及解决,当然解决的方式是不一的,可以根据具体环境的问题灵活使用。

TOP 命令解析

Linux中top命令是排查问题最有效的利器,但是很多人对top认识不深刻,而且网上很多博客有些错误的阐述,所以这里先来讨论一下在top命令中需要注意的三个信息:load average、CPU使用占用比、CPU占用率高的线程。清楚的话可以跳过这一节。

load average

下面是top命令的结果:

在这里插入图片描述

先来看load average。其中1.02 、1.05 、1.01分别为1分钟、5分钟、15分钟CPU负载的情况。在很多博客上看到说load average大于5的时候就是超负荷的情况了,但是load average值是否超标是要根据你CPU的核数来判断的。

一般来说,Load Average是与机器内核数有关的。以一个单核的机器为例,load=0.5表示CPU还有一半的资源可以处理其他的线程请求,load=1表示CPU所有的资源都在处理请求,没有剩余的资源可以利用了,而load=2则表示CPU已经超负荷运作,另外还有一倍的线程正在等待处理。所以,对于单核机器来说,理想状态下,Load Average要小于1。同理,对于双核处理器来说,Load Average要小于2。结论是:多核处理器中,你的Load Average不应该高于处理器核心的总数量。

简单来说,但你的CPU核数为单核时,load average为0-1是一个正常的情况,如果是1.5那说明要一半的工作在等待中。如果你的CPU核数为4核十,load average为0-4是一个正常的情况。

那么如何查看你当前CPU的核数呢?你可以在top命令情况下按下1,就可以看到。

CPU使用占用比

接着来看CPU的使用占用比情况。在上图 %CPU 那行可以看到一系列占用CPU的百分比情况,其中:

us #用户空间占用CPU百分比
sy #内核空间占用CPU百分比
ni #用户进程空间内改变过优先级的进程占用CPU百分比
id #空闲CPU百分比
wa #等待输入输出的CPU时间百分比
hi #硬中断
si #软中断

首先需要明白的就是 Cpu(s) 和下面进程占用CPU情况的区别。可能有人会觉得奇怪:为什么PID为8783的进程明明占用了96.4%的CPU情况,但是为什么 us 用户空间占用只有38.9%呢?us 和 进程占用CPU的百分比有什么联系呢?

在这里插入图片描述

这是因为进程执行过程是分为内核态和用户态的。比如你在执行一个IO过程,因为IO必须要由内核程序亲自调用,那么调用IO的这段时间就是内核 sy 的时间了,其他时间则为用户 us 执行时间。所以虽然这个线程占用了CPU的96%的时间,但是实际上这个时间是分为了内核态和用户态的时间的。

CPU占用率高的线程

有些人看到一个进程占用100%的情况就觉得自己的节点要爆炸了,当然这么说是夸张了。但是如果你的CPU是多核的,那么就算你的某个进程占用了100%的情况也是没关系的,因为Cpu(s) 显示的所有核数的平均情况。
在这里插入图片描述

在top情况下按1,查看CPU的所有核的情况:可以知道一个用户进程只是针对某一核的,如果你的CPU有12核,那么就意味着你最高可以有12个100%占用CPU的进程同时运行。
在这里插入图片描述

CPU负载过高

上面简单的说明了一下top命令该注意的地方,那么现在再应用一下。实验环境:Linux + 单核CPU。

为了重现问题,在Linux运行了以下脚本:

public class Test {

    public static void say(){
        System.out.println("abc");
        System.out.println("123");
    }
    
    public static void main(String args[]){
        say();
        while(true) {
            System.out.println("1");
        }
    }
}

使用top命令查看:
在这里插入图片描述

因为是CPU是单核的原因,所以从load average上看出来,CPU已经是负载运行了。这个时候,可以去看一下PID为8783的进程中有有哪些线程,使用一下命令:

top -Hp 8783 # -H 可以查看由某个进程启动的所有线程 ,p指定要看的进程

在这里插入图片描述

可以看到8783进程中8784线程占用了CPU的时间比最高。这个时候可以使用jstack命令查看,8783线程在运行什么代码,在使用jstack命令之前,需要将8784转为16进制,使用以下命令:

printf '%x\n' 8784 # 得到2250

使用jstack命令查看线程为8784的情况:

jstack 8783 | grep '2250' -A 100 # -A 表示在grep匹配到之后再输出100行

在这里插入图片描述

可以看到当前线程执行代码块位置,这个时候就可以去根据你的代码逻辑去排查问题了。

内存溢出

内存溢出的解决办法可以查看我之前的博客:JVM 之 性能监控与故障处理

频繁Full GC

首先你可以使用jstat -gcutil查看一下堆回收的基本情况。

jstat -gcutil <pid> 1000 # 每1000毫秒输出<pid>堆的使用情况

通常来说触发Full GC有以下几点原因:

显示调用System.gc() 。只是建议系统进行GC,并不一定触发

长期存活的对象将进入老年代。

大对象直接进入老年代。

Minor GC晋升到旧生代的平均大小大于老年代的剩余空间 。比如你第一次Minor GC有2M晋升到老年代中,那么下次执行Minor GC时会先判断老年代的空间是否大于2M。

通过jstat的结果可能可以排除掉一些原因,但是最好是结合GC日志来查看。GC的日志文件可以在JVM启动时,添加-XX:+PrintGCDetails,或者你想在不停掉服务的情况,使用jinfo的命令去动态的调整虚拟机的各项参数:

jinfo -flag +PrintGCDetails <pid>

下面就是GC日志,你可以知道当前GC的类型(如果是System.gc,会在后面给出提示)、堆使用的垃圾收集器,回收时间等信息:

[GC (System.gc()) [PSYoungGen: 3686K->664K(38400K)] 3686K->672K(125952K), 0.0016607 secs][Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (System.gc()) [PSYoungGen: 664K->0K(38400K)] [ParOldGen: 8K->537K(87552K)] 672K->537K(125952K), [Metaspace: 2754K->2754K(1056768K)], 0.0059024 secs][Times: user=0.00 sys=0.00, real=0.01 secs] 
Heap
 PSYoungGen      total 38400K, used 333K [0x00000000d5c00000, 0x00000000d8680000, 0x0000000100000000)
  eden space 33280K, 1% used [0x00000000d5c00000,0x00000000d5c534a8,0x00000000d7c80000)
  from space 5120K, 0% used [0x00000000d7c80000,0x00000000d7c80000,0x00000000d8180000)
  to   space 5120K, 0% used [0x00000000d8180000,0x00000000d8180000,0x00000000d8680000)
 ParOldGen       total 87552K, used 537K [0x0000000081400000, 0x0000000086980000, 0x00000000d5c00000)
  object space 87552K, 0% used [0x0000000081400000,0x00000000814864a0,0x0000000086980000)
 Metaspace       used 2761K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 299K, capacity 386K, committed 512K, reserved 1048576K

日志分析:

1.GC日志开头的”[GC”和”[Full GC”说明了这次垃圾收集的停顿类型,如果有”Full”,说明这次GC发生了”Stop-The-World”。因为是调用了System.gc()方法触发的收集,所以会显示”[Full GC (System.gc())”,不然是没有后面的(System.gc())的。

2.“[PSYoungGen”和”[ParOldGen”是指GC发生的区域,分别代表使用Parallel Scavenge垃圾收集器的新生代和使用Parallel old垃圾收集器的老生代。为什么是这两个垃圾收集器组合呢?因为我的jvm开启的模式是Server,而Server模式的默认垃圾收集器组合便是这个,在命令行输入java -version就可以看到自己的jvm默认开启模式。还有一种是client模式,默认组合是Serial收集器和Serial Old收集器组合。

3.在方括号中”PSYoungGen:”后面的”3686K->664K(38400K)”代表的是”GC前该内存区域已使用的容量->GC后该内存区域已使用的容量(该内存区域总容量)”

4.在方括号之外的”3686K->672K(125952K)”代表的是”GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”

5.再往后的”0.0016607 sec”代表该内存区域GC所占用的时间,单位是秒。

6.再后面的”[Times: user=0.00 sys=0.00, real=0.00 secs]”,user代表进程在用户态消耗的CPU时间,sys代表代表进程在内核态消耗的CPU时间、real代表程序从开始到结束所用的时钟时间。这个时间包括其他进程使用的时间片和进程阻塞的时间(比如等待 I/O 完成)。

7.至于后面的”eden”代表的是Eden空间,还有”from”和”to”代表的是Survivor空间。

上面的操作算是排除问题的一种思路,但是你需要定位到代码,还是要把当前堆dump出来,然后使用MAT或者其他工具进行分析:

jmap -dump:[live,]format=b,file=<filename> <pid> # 把堆的对象情况dump到一个文件中

如何使用MAT在 JVM 之 性能监控与故障处理 已经描述过了。

对冲策略与马丁结合ea的编程实践(五)核心是把两个品种合成一个新品种 在外汇、数字货币、期货交易甚至赌博中,马丁策略、网格策略是最常用的策略,也是最容易被理解的策略,但是如何克服单边行情、极端行情,是使用马丁策略最为头疼的事情,如加大间距、加大资金量,只能缓解,并不能根本解决这样的情况,所以使用时大部分时候都心里没底。 有没有一种正确的思路,让行情控制在震荡范围以内呢,这是今天我要向大家分享的一个思路,那就是对冲。大家看下图: 大家可以看到欧美(EURUSD)和镑美(GBPUSD),这两个品种,大部分时候走势是一致的,那么我们有没有可能把他们两个品种进行一下合成,比如买0. 阅读详情

相关推荐

如何判断一个程序员的技术比你强?

技术大佬与普通程序员之间存在明显的认知差异:前者善于将复杂问题抽象为经典计算机科学问题,用声明式代码替代过程式逻辑;对异常和边界条件极度敏感,具备系统化的排查方法论;代码追求高可读性而非炫技,且执着于底层原理研究。这种技术压制体现在解决问题的确定性上——通过扎实的理论功底和工程直觉,快速定位问题本质,而非依赖试错或搜索。真正的技术实力源于对底层逻辑的深刻理解和对系统稳定性的敬畏。

wldtzzming的专栏 1088

生产问题定位步骤

生产问题定位步骤 1、如何查看当前tomcat的连接数呢? 假设服务器上开启了 2个tomcat实例,分别监听8040和8050端口 netstat -na | grep ESTAB | grep 8040 | wc -l netstat -na | grep ESTAB | grep 8050 | wc -l 2、查看业务和数据库无压力 继续增加业务节点 ...

liuqianduxin的博客 698

Claude Code插件安装与VSCode深度集成实战指南

Claude Code是一款专为IDE设计的AI编程助手插件,其核心价值在于将自然语言意图转化为可运行代码,从而优化开发者认知带宽分配。它依赖Node.js运行时、git版本上下文和VSCode编辑器API三者协同工作,技术原理涉及本地进程通信、权限策略绕过、上下文感知补全等关键机制。该工具显著提升工程效率,适用于CLI开发、EXIF元数据处理、异步逻辑生成等典型JavaScript/TypeScript应用场景。本文聚焦Claude Code插件在VSCode中的真实落地链路,覆盖Windows/macO

weixin_34006468的博客 474

常见生产环境问题及排查方法

常见生产问题

liufang1991的专栏 2468

贝塞尔曲线原理--曲线生成--路径规划--matlab代码

贝塞尔曲线有着很多特殊的性质, 在图形设计和路径规划中应用都非常广泛, 在路径规划中贝塞尔曲线完全由其控制点决定其形状, n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制.

bob595078694的博客 1万+

鸿蒙读书笔记1:《鸿蒙操作系统设计原理与架构》

GUI、 语 音 控 制 方 式 的 VUI(Voice User Interface, 语 音 用 户 界。电话、多媒体、DFX、MSDP(Multimodal Sensor Data Platform,多。面)、手势/姿态控制的CVUI(Computer Vision User Interface,计算。KAL(Kernel Abstract Layer,内核抽象层)通过屏蔽多内核差异,JavaScript、C、C++等多语言的用户程序开发框架,以及UI框架、

jackyrongvip的专栏 2451

如何定位前端线上问题(如何排查前端生产问题)

  一直以来,前端的线上问题很难定位,因为它发生于用户的一系列操作之后。错误的原因可能源于机型,网络环境,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决。 当然,这些问题并非不能克服,让我们来一起看看如何去定位线上的问题吧。   所谓,工欲善其事必先利其器,你不能撸起袖子蛮干,所以,我们需要一个工具。我们曾经尝试用过很多监控工具去统计这些错误,比如,听云、OneApm、...

weixin_33790053的博客 1099

复旦微FMQL45T900平台RGMII网口调试实战:从PHY寄存器读取异常到链路建立

本文详细记录了复旦微FMQL45T900平台RGMII网口调试的全过程,重点解决了PHY寄存器读取异常问题。通过电压配置调整、时序优化和硬件信号完整性检查,最终成功建立网络链路。文章提供了实用的调试经验和解决方案,适合嵌入式开发人员参考。

weixin_29193359的博客 288

java生产问题快速定位_生产环境如何快速跟踪、分析、定位问题-Java

我相信做技术的都会遇到过这样的问题,生产环境服务遇到宕机的情况下如何去分析问题?比如说JVM内存爆掉、CPU持续高位运行、线程被夯住或线程deadlocks,面对这样的问题,如何在生产环境第一时间跟踪分析与定位问题很关键。下来让我们看看通过如下步骤在第一时间分析问题。CPU占用较高场景收集当前CPU占用较高的线程信息,执行如下命令:top -H -p PID -b -d 1 -n 1 > t...

weixin_34190533的博客 963

【计算机视觉】pyrealsense2:Intel RealSense 深度相机的 Python 接口实战指南

pyrealsense2:Intel RealSense 深度相机的 Python 接口实战

weixin_43988131的博客 4352

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

Java排查问题指南:如何快速定位线上故障

在应用程序出现故障时,查看日志文件可以提供有关故障的有价值的信息,例如异常堆栈跟踪和错误消息。在上面的代码中,我们使用JConsole连接到运行在< hostname>:< port>上的Java应用程序。请注意,这只是一些排查问题的基本工具和技术,还有很多其他的工具和技术可以用于Java应用程序的故障排除。在上面的代码中,我们使用jstack命令生成一个名为thread_dump.txt的线程转储文件。在上面的代码中,我们使用jmap命令生成一个名为heapdump.hprof的堆转储文件。

m0_49151953的博客 926

基于传感器数据实现火灾报警预测分析

火警 系统当检测到烟雾、火灾、一氧化碳或其他与火灾有关或一般通知的紧急情况时,向人们发出警告

DT程序员的博客 723

如何快速定位Java生产环境中的问题

作为一名略懂Java的大数据开发,生产环境出问题几乎是家常便饭。在处理大数据量的开发前提下, 上线程序之后CPU 飙高、内存溢出、数据错乱的问题时常发生。为了降低上线对系统的影响,通常时间窗口都在凌晨而且较短,这就要求我们具备快速定位和修复问题的能力。上面是开发上线过程中遇到过的部分问题,对于 Java 而言,日志 + 常用的linux命令 + jvm命令就可以定位出来大部分的问题。对于数据库或者组件,我们也可以通过日志和内置命令来分析问题。

CatchLight的博客 854

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java 生产环境性能问题定位实战

本文总结了Java生产环境性能问题的定位与解决方法,聚焦内存泄漏、CPU飙升、网络延迟和IO响应慢四大类问题。以内存泄漏为例,详细阐述了问题本质、监控指标、定位步骤和代码修复方案。通过工具链(jmap、MAT、Arthas等)分析堆转储和GC日志,结合典型代码案例(如静态Map无限增长、ThreadLocal未清理)说明问题根源及修复方法。文章采用"现象识别→逐步定位→代码分析→修复验证"的完整流程,为Java生产环境性能问题排查提供实战指导。

小飞的博客 459

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

生产环境定位JAVA异常_生产环境如何快速跟踪、分析、定位问题-Java

我相信做技术的都会遇到过这样的问题,生产环境服务遇到宕机的情况下如何去分析问题?比如说JVM内存爆掉、CPU持续高位运行、线程被夯住或线程deadlocks,面对这样的问题,如何在生产环境第一时间跟踪分析与定位问题很关键。下来让我们看看通过如下步骤在第一时间分析问题。CPU占用较高场景收集当前CPU占用较高的线程信息,执行如下命令:top -H -p PID -b -d 1 -n 1 > t...

weixin_29518761的博客 495

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

生产环境如何快速跟踪、分析、定位问题-Java

我相信做技术的都会遇到过这样的问题,生产环境服务遇到宕机的情况下如何去分析问题?比如说JVM内存爆掉、CPU持续高位运行、线程被夯住或线程deadlocks,面对这样的问题,如何在生产环境第一时间跟踪分析与定位问题很关键。下来让我们看看通过如下步骤在第一时间分析问题。 CPU占用较高场景 收集当前CPU占用较高的线程信息,执行如下命令: top -H -p PID -b -d...

weixin_30855761的博客 1056

生产环境Java性能问题频发?AsyncProfiler实战技巧全掌握,快速定位GC与火焰图异常

快速定位Java性能瓶颈,掌握AsyncProfiler实战技巧。本指南详解GC异常、火焰图分析等生产环境常见问题的监控方法,适用于高并发、低延迟场景,助力高效诊断CPU与内存开销。Java性能监控工具AsyncProfiler使用指南值得收藏。

LiteProceed的博客 644

JAVA项目远程DEBUG预生产环境定位问题爽滋滋

1.本地配置debug启动项目 配置远程 host和启动参数的端口 2。打包本地项目 3.启动远程项目 如果是springboot java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8894(图1中的port) xxx.jar 如果是tomcat 在catalina.sh export JAVA_OPTS='-agentlib:jdwp=transport=dt_socket

1679

Java系统线上生产问题排查一把梭

无法使用调试工具从远程附加进程快速恢复为先,即使在结婚,也得赶紧修复线上问题。而且生产环境流量大、网络权限严格、调用链路复杂,因此更容易出问题,也是出问题最多的环境。2 监控生产环境出现问题时,因为要尽快恢复应用,就不可能保留完整现场用于排查和测试。因此,是否有充足的信息(日志、监控和快照)可以了解历史、还原bug 场景。最常用的就是 ELK 的日志了,注意:确保错误、异常信息可被完整记录到文件日志确保生产上程序的日志级别是INFO以上。

2401_89284451的博客 977

java面试题: 生产环境CPU 占用过高,? 如何分析 定位问题,聊聊

1-top找出谁的cpu占比 比较高,进程编号是5101 2-ps -ef 或者jps 进一步精确定位 3-定位到具体的线程或者代码 4-需要的线程ID 转换为16进制 用计算器转换也可以 5-jstack 进程Id 查看堆栈信息 定位到第10行代码 找到源程序,找到第10行代码 ...

面朝大海,春暖花开 661

【Java线程死锁排查终极指南】:手把手教你用jstack定位并解决生产环境死锁问题

快速定位Java线程死锁问题,详解如何使用jstack作为排查工具。适用于生产环境,通过线程栈分析锁定死锁根源,操作简单、无需额外依赖。结合实际案例演示完整排查流程,高效解决系统卡顿,值得收藏。

IterLoom的博客 1041

揭秘Java内存泄漏:如何在1024节前快速定位并解决生产环境OOM问题

auto-generated

SimTrans的博客 378

JVM生产环境问题定位与解决实战(三):揭秘Java飞行记录器(JFR)的强大功能

是 Oracle JDK 内置的性能分析工具,用于监控 JVM 和 Java 应用程序的运行时行为。低开销:生产环境中通常仅产生1%左右的性能损耗实时监控:可记录 JVM 事件、方法调用、内存分配等详细信息、支持动态启停记录事件驱动:捕获超过 200 种不同类型的事件(JDK 11+)集成分析:与 Java Mission Control (JMC) 工具深度集成。

篱笆女人和狗的博客 2351

面试官问:生产环境遇到难题,你是如何解决的?

1、生产环境发生 cpu 飙高的问题?你是如何定位解决的呢?我们的线程是运行在 cpu 上面1. CAS 自旋一直重试导致 cpu 飙高 没有控制自旋次数;乐观锁2. 死循环;3. 阿里云 Redis 被注入挖矿程序,建议 Redis 端口不要能够被外网访问;4. 服务器被 DDOS 工具导致 cpu 飙高,可以通过限流、ip 黑名单、图形验证码防止机器模拟攻击;创建过程中,需要配置线程名称呢?阿里巴巴的 java 开发手册 使用到线程池建议配置线程池名称方便在后期可以定位是那个业务相关

weixin_54828627的博客 2676

java错误日志打印问题

前言:说来惭愧,做了5,6的java开发,今天才发现之前的打印方式是错误的,生产环境出了问题,但是没法定位,后来发现输出方式有问题,为此记录一下; 已下面方法作为测试 import org.slf4j.Logger; import org.slf4j.LoggerFactory private Logger logger = LoggerFactory.getLogger(AccountCont...

qiaziliping的博客 5446
上一篇: 词向量相似性(Word Similarity)、类比任务(Word Analogy)实验数据
下一篇: IO多路复用底层原理分析
CallMeJiaGu
博客等级 码龄12年 149粉丝 99原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值