线上异常的处理

news2024/12/22 23:53:27

一、线上问题的排查 

进程ID 简称为PID

free -m
查看内存使用情况

iostat
查看磁盘读写活动情况

netstat
查看网络连接情况

df -h
查看磁盘空间使用情况

du -sh
查看文件大小情况

1.1、top 命令查看CPU占用情况

top -n num 查看CPU占用最高的num个进程
top -Hp PID 或 top -H -p PID  查看该进程号的所有线程CPU与内存占用情况,找到占用最多的线程ID

1.2、jstack 命令查看Java线程信息

生成 Java 虚拟机当前时刻的线程快照

jps -l 显示当前所有 Java 进程ID 的命令 (window环境和linux环境)

printf '%x\n' PID 或 printf %x PID表示将线程ID 转换为十六进制,用于搜索线程堆栈中的关键信息 (linux环境)

jstack PID | grep 线程ID 查看线程堆栈信息 (linux环境)

jstack PID | grep -C10 线程ID --color 查看线程堆栈信息 (linux环境)

jstack -l PID 查看线程堆栈信息

jstack PID >> stack.txt 将当前所有堆栈信息输出到stack.txt文件中

1.3、jstat 命令查看GC信息

jstat -gcutil PID 1000 2 或 jstat -gc PID 1000 2 表示进程ID每间隔1000毫秒统计2次(缺省代表一直统计),查看某进程GC持续变化情况。
gcutil 的意思是[已使用空间]占[总空间]的百分比。
新生代Eden区(E,表示Eden)使用了65.33%(最后)的空间
两个Survivor区(S0、S1,表示Survivor0、Survivor1)分别是0和94.27%
老年代(O,表示Old)使用了63.80%
程序运行以来共发生Minor GC(YGC,表示Young GC)53次,总耗时1.189秒(YGCT 表示耗时),
发生Full GC(FGC,表示Full GC)4次,总耗时0.739秒(FGCT 表示耗时)
总的耗时(GCT,表示GC Time)为1.929秒。

1.4、 jmap 命令分析内存

JDK中提供用来监视进程运行中的jvm物理内存的工具。
该进程内存中所有对象的情况,例如产生了哪些对象,对象数量。
当系统崩溃时,jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等。
注意:使用jmap dump堆信息时,会触发Full GC, 触发Full GC 可能导致线上服务不可用。
如果想dump堆信息,可以使用gcore命令,比jmap -dump快。

jmap -heap PID 查看进程的JVM占用内存情况

jmap -histo:live PID 显示堆中当前活动的所有对象的统计信息,按实例对象数量从高到低显示。重点关注实例对象数量过多的类。并找到对应程序。

jmap -histo PID | head -n 10 查看前10的对象统计信息(仅用于linux, window执行不了)

jmap -dump:format=b,file=heap.dump PID 生成堆转储快照dump文件(即:导出堆信息)

jmap -dump:format=b,file=heap.hprof PID 生成堆转储快照dump文件(即:导出堆信息)

1.5、 arthas工具

线上监控诊断产品,通过全局视角实时查看应用 load、内存、GC、线程的状态信息,
在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等。
1.下载arthas 只要解压,就能直接使用(window 和 linux使用方式相同)
2.linux环境 , 进入 arthas 目录下,输入java -jar arthas-boot.jar
3.window 环境,在 arthas 目录下,按住shift + 右击,打开命令窗口,输入上面的命令。
4.输入 java 项目前面的序号(即:数字)

dashboard 查看总体概况,发现有CPU占用高的进程
thread PID 可以查看指定线程信息,能迅速定位到问题代码

1.6、 异常情况解决总结 

GC问题: top + top -Hp + jstack 排查是"VM Thread"消耗过多资源,可以进一步使用 jmap 工具进行内存溢出排查。
业务执行过慢问题: top + top -Hp + jstack 排查发现是普通业务线程,可看到具体是哪个接口。
死锁: jstack + Java 进程打印堆栈信息中包含死锁信息deadlock
线程处于waiting状态: 多打印几次``jstack` 信息,对比一直停留在waiting状态的线程。

二、节省内存的建议

2.1、使用原始数据类型

int x = 42;      // 使用 int 而不是 Integer
double d = 3.14; // 使用 double 而不是 Double
boolean b = true; // 使用boolean而不是Boolean

2.2、避免不必要的对象创建

String s = "Hello" + " World"; // 改为使用 StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" World");
String s = sb.toString();

2.3、使用惰性初始化

private List<String> myList;
if (myList == null) {
    myList = new ArrayList<>();
}

2.4、重用对象

List<String> tempList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    tempList.add("Item " + i);
    // 用 tempList 做点什么
}
tempList.clear(); // 清除列表以供重用
for (int i = 0; i < 1000; i++) {
    tempList.add("Another item " + i);
    // 用 tempList 做点什么
}

2.5、循环外申明对象,循环内创建对象。

User user;
for (int i = 0; i < 1000; i++) {
     user = new User();
    // 用 user 做点什么
}

2.6、使用数组而不是集合

String[] array = new String[1000];
for (int i = 0; i < 1000; i++) {
    array[i] = "Item " + i;
    // 用数组做点什么
}

2.7、尽量使用移位来代替'a*b'的操作

同样的,对于'*'操作,使用移位的操作将会更快和更有效

int num = a * 4;
int num = a * 8;
应该改为
int num = a << 2;
int num = a << 3;

2.8、避免使用同步

同步会影响Java程序的性能,因为它会导致线程的切换和等待。在多线程环境中,可以使用volatile、Atomic类或者Concurrent数据结构来保证线程安全。

2.9、尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。

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

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

相关文章

Vulnhub系列靶机--- Hackadmeic.RTB1

系列&#xff1a;Hackademic&#xff08;此系列共2台&#xff09; 难度&#xff1a;初级 信息收集 主机发现 netdiscover -r 192.168.80.0/24端口扫描 nmap -A -p- 192.168.80.143访问80端口 使用指纹识别插件查看是WordPress 根据首页显示的内容&#xff0c;点击target 点击…

Java-类与对象(上)

什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。 面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。 以面向对象方式来进行处理&#xff0c;就…

宏病毒的实践

一、实验目的&#xff1a; 1、了解梅丽莎宏病毒基本概念 2、自己实验梅丽莎宏病毒 二、预备知识&#xff1a; 1.什么是word宏 宏是一个批处理程序命令&#xff0c;正确地运用它可以提高工作效率。微软的office软件运行用户自己编写&#xff0c;叫VBA的脚本来增加其灵活性&…

12. 登录拦截器

由于论坛中的所有功能接口都需要在用户登录的情况下才能访问&#xff0c;所以要做统一的登录身份校验。 1. 在 interceptor 包下创建 LoginInterceptor Component // 交给 Spring 管理 public class LoginInterceptor implements HandlerInterceptor {// 从配置文件中读取配…

ChatGPT和Claude的能力全测评

创造性思维/语言 提示&#xff1a;“写一首 4 行诗&#xff0c;每行只有 3 个词&#xff0c;描写重庆” ChatGPT写诗&#x1f447; Claude写诗&#x1f447; 仁者见仁&#xff0c;您怎么看谁更强&#xff1f; 提示&#xff1a; "如果你随机选择这个问题的答案&#xff0c;…

postgresql 的递归查询

postgresql 的递归查询功能很强大&#xff0c;可以实现传统 sql 无法实现的事情。那递归查询的执行逻辑是什么呢&#xff1f;在递归查询中&#xff0c;我们一般会用到 union 或者 union all&#xff0c;他们两者之间的区别是什么呢&#xff1f; 递归查询的执行逻辑 递归查询的…

⛳ TCP 协议面试题

目录 ⛳ TCP 协议面试题&#x1f43e; 一、为什么关闭连接的需要四次挥⼿&#xff0c;⽽建⽴连接却只要三次握⼿呢&#xff1f;&#x1f3ed; 二、为什么连接建⽴的时候是三次握⼿&#xff0c;可以改成两次握⼿吗&#xff1f;&#x1f463; 三、为什么主动断开⽅在TIME-WAIT状态…

shell 简单且常用的几种

目录 一、配置环境的shell脚本 二、系统资源脚本 一、要求 二、脚本内容 三、脚本解析 四、赋权并验证 一、配置环境的shell脚本 systemctl stop firewalld systemctl disable firewalld systemctl stop NetworkManager systemctl disable NetworkManager setenforce…

动物IT

动物是地球上最丰富和多样化的生物群体之一。它们包括鱼类、鸟类、爬行动物、两栖动物和哺乳动物等各种类型。动物在地球上有着不同的生态角色和生活习性。 动物对于维持生态平衡和生态系统的稳定性至关重要。它们在食物链中扮演着重要的角色&#xff0c;通过捕食和被捕食来保…

【李沐】3.5、softmax回归的从0开始实现

注意&#xff1a; 把每个像素位置看作⼀个特征 # 导入PyTorch库 import torch # 从IPython库中导入display模块&#xff0c;用于在交互式环境中显示内容 from IPython import display # 从d2l.torch模块中导入torch作为d2l的别名&#xff0c;方便后续使用d2l库中的功能 from d…

阿里云轻量应用服务器和云服务器有什么区别?2023更新

阿里云轻量应用服务器和云服务器ECS有什么区别&#xff1f;ECS是专业级云服务器&#xff0c;轻量应用服务器是轻量级服务器&#xff0c;轻量服务器使用门槛更低&#xff0c;适合个人开发者或中小企业新手使用&#xff0c;可视化运维&#xff0c;云服务器ECS适合集群类、高可用、…

ForkJoin框架

1. ForkJoin框架概述 ForkJoin模式先把一个大任务分解成许多个独立的子任务&#xff0c;然后开启多个线程并行去处理这些子任务。有可能子任务还是很大而需要进一步分解&#xff0c;最终得到足够小的任务。ForkJoin模式的任务分解和执行过程大致如下图所示。 ForkJoin模式借助…

NSS [CISCN 2019初赛]Love Math

NSS [CISCN 2019初赛]Love Math 开题直接给源码 <?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("…

差值结构的复合底部

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A 中有3个点&#xff0c;B中有1个点&#xff0c;且不重合&#xff0c;统计迭代次数并排序。 其中有20组数据 让迭代次数与排斥能成反比&#xff0c;排…

1、Spring_IOC

IOC 1.概述 IOC&#xff1a;Inversion of Control 控制反转&#xff0c;可以让容器负责对象的创建以及销毁操作&#xff0c;对象在容器中叫 bean 2.回顾问题 问题&#xff1a;写了太多与业务无关的代码 耦合度非常高&#xff0c;写了很多和业务无关的代码不利于项目的升级迭…

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 目录 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 程序设计 完整源码和数据获取方式&#xff1a; …

高级产品经理如何以不同的方式应对挑战

我经常被问到产品经理如何晋升到更高级别。事实上&#xff0c;获得晋升往往是一场复杂的游戏。是的&#xff0c;你的技能和成就很重要&#xff0c;但其他因素也很重要&#xff0c;比如你的经理对人才培养的关心程度、你的同事有多优秀、任期有多长、公司的政治氛围如何等等。 所…

TCP编程流程(补充)

目录 1、listen&#xff1a; 2、listen、tcp三次握手 3、 发送缓冲区和接收缓冲区&#xff1a; 4、tcp编程启用多线程 1、listen&#xff1a; 执行listen会创建一个监听队列 listen(sockfd,5) 2、listen、tcp三次握手 三次握手 3、 发送缓冲区和接收缓冲区&#xff1a;…

【深入探究人工智能】:常见机器学习算法总结

文章目录 1、前言1.1 机器学习算法的两步骤1.2 机器学习算法分类 2、逻辑回归算法2.1 逻辑函数2.2 逻辑回归可以用于多类分类2.3 逻辑回归中的系数 3、线性回归算法3.1 线性回归的假设3.2 确定线性回归模型的拟合优度3.3线性回归中的异常值处理 4、支持向量机&#xff08;SVM&a…

Linux的热拔插UDEV机制

文章目录 UDEV简介守护进程基本特点 守护进程和后台进程的区别开发守护进程结束 UDEV简介 udev是一个设备管理工具&#xff0c;udev以守护进程的形式运行&#xff0c;通过侦听内核发出来的uevent来管理/dev目录下的设备文件。 udev在用户空间运行&#xff0c;而不在内核空间 …