线上异常的处理

news/2024/5/20 10:48:07/文章来源:https://blog.csdn.net/weixin_42679286/article/details/132393305

一、线上问题的排查 

进程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.luyixian.cn/news_show_159093.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ROS】参数服务器--理论模型与参数操作(C++)

一、概念介绍 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。 作用&#xff1a;存储一些多节点…

【MySQL系列】SQL语句入门(创建删除操作)、字符集和数据类型详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

HummingBird 基于 Go 开源超轻量级 IoT 物联网平台

蜂鸟&#xff08;HummingBird&#xff09; 是 Go 语言实现的超轻量级物联网开发平台&#xff0c;包含设备接入、产品管理、物模型、告警中心、规则引擎等丰富功能模块。系统采用GoLang编写&#xff0c;占用内存极低&#xff0c; 单物理机可实现百设备的连接。 在数据存储上&…

就算没有那个所谓的“国产保护月”,好莱坞电影也打不过中国电影

据路透社、美国文娱杂志《Variety》网站等18日报道&#xff0c;中国大陆暑期档票房在17日就已经超过了2019年同期的178亿元人民币&#xff0c;提前14天锁定了“史上最强暑期档”。这一份傲人的成绩单中&#xff0c;西方好莱坞电影所起到的作用却“微乎其微”。 更令人尴尬的是…

AI项目二:基于mediapipe的虚拟绘画

若该文为原创文章&#xff0c;转载请注明原文出处。 一、项目介绍 随着人工智能时代的到来&#xff0c;许多技术得到了空前的发展&#xff0c;让人们更加认识到了线上虚拟技术的强大。 通过mediapipe识别手的关键点&#xff0c;检测中指&#xff0c;实现隔空画画的操作。 通…

【LeetCode-中等题】128. 最长连续序列

题目 题解一&#xff1a;HeshSet枚举 思路&#xff1a;先对数组进行set去重&#xff0c;核心就是&#xff0c;先找出临界值&#xff08;假设以最小临界为例&#xff0c;那么这个临界值自己就是最小值&#xff0c;&#xff09;&#xff0c;以临界值不断做加1操作&#xff0c;看…

Excel/PowerPoint条形图改变顺序

条形图是从下往上排的&#xff0c;很多时候不是我们想要的效果 解决方案 选择坐标轴&#xff0c;双击&#xff0c;按下图顺序点击 效果

常见的 Python 错误及其解决方案

此文整理了一些常见的 Python 错误及其解决方案。 1、SyntaxError: invalid syntax 说明&#xff1a;无效的语法是最常见的错误之一&#xff0c;通常是由于编写代码时违反了 Python 的语法规则。可能的原因&#xff1a; 忘记在 if、while、for 等语句后写冒号&#xff0c;或者…

跟着NC学作图 | 使用python绘制折线图

写在前面 今天分享一篇使用Python绘制折线图的教程&#xff0c;在我们前提的教程中&#xff0c;关于使用R语言绘制折线图的教程也很少&#xff0c;跟着PC学作图 | 小提琴图Tufte箱形图折线图的绘制教程也只有相关一部分。 Python自己也是一直在学习&#xff0c;那么也就顺带分…

Python编程基础-函数

函数定义与调用 将完成某一特定功能并经常使用的代码编写成函数&#xff0c;在需要使用时直接调用 def 函数名(函数参数): 函数体 return 表达式或者值 def printHello(): #打印hello字符串print (hello)def printNum(): #输出0--9数字for i in range(0,10):print (i)return…

vue3 setup语法糖导入mixin

像这样直接导入&#xff0c;然后通过defineOptions声明mixin 然后就可以在这个组件使用mixin里的数据和方法了

java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?

目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 基本介绍 还记得我们的java集合框架吗, 我们来复习一下, 如图: 可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信…

攻防世界-warmup

原题解题思路 只有一张图片&#xff0c;就查看源代码&#xff0c;有一个source.php。 查看source.php&#xff0c;白名单中还有一个hint.php。 hint.php告诉我们flag的位置ffffllllaaaagggg 但是直接跳转是没用的&#xff0c;构造payload。 http://61.147.171.105:55725/sourc…

新版QQ NT 桌面版如何实现内存优化

一、背景 QQ 作为国民级应用,从互联网兴起就一直陪伴着大家,是很多用户刚接触互联网就开始使用的应用。而 QQ 桌面版最近一次技术架构升级还是在移动互联网兴起之前,在多年迭代过程中,QQ 桌面版也积累了不少技术债务,随着业务的发展和技术的进步,当前的架构已经无法很好…

编译老版本c++程序 报错 msvcrt.dll 以及 0x000000 内存 不能为 “read“ 问题 已解决

一般 win10 编译 xp对应老版本软件 调试采用 虚拟机形式进行测试&#xff0c;但是虚拟机中&#xff0c;无独立显卡&#xff0c;运行程序提示有&#xff0c;无法调用动态库&#xff0c;或者 内存无法读取&#xff0c;炸一看以为 winxp32位 内存识别只能3.7G.其实是显存无法使用…

fedora

比起浑混噩噩地去追逐不想要的东西&#xff0c;还是做点自己想做的更meaningfu l about firewall well, I don’t know how to use fedora firewall,but it I come up with that I can use ubuntu’s ufw for blocking evil connection, download wps extremely boredness d…

从LeakCanary看如何判断对象被回收了

前面已经了解了Service&#xff0c;Fragment&#xff0c;ViewModel对象的销毁时机&#xff0c;那么在触发销毁时机后&#xff0c;我们怎么判断这些对象有没有回收呢&#xff1f; 大家都知道在Java中有强引用&#xff0c;弱引用&#xff0c;软引用&#xff0c;虚引用四种引用方…

【MySQL】JSON 格式字段处理

MySQL 5.7 版本后已支持 JSON 格式&#xff0c;这虽是 MySQL 的一小步&#xff0c;但可以说是程序开发的一大步&#xff0c;再也不用将 JSON 内容塞到 VARCHAR 类型字段了&#xff0c;程序设计也会变得更加灵活。网上大多只针对JSONObject 对象类型&#xff0c;本文也将详解 JS…

md文本学习

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…