Arthas 使用

news2024/11/24 20:54:32

Arthas是阿里巴巴开源的Java诊断工具,采用命令行交互的形式进行问题的定位与诊断。它能够帮助你.

解决以下问题:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从JVM内查找某个类的实例?
    下面就实际常用到的功能做一些简单介绍:

Arthas 安装与使用

https://github.com/alibaba/arthas

在局域网的离线环境下,需要下载arthas的全量包
在这里插入图片描述

Idea Arthas 插件安装

可能你会觉得写Arthas的命令很繁琐,初学者写命令效率低,Idea中arthas插件可以解决这一问题。
在Idea插件中搜索“arthas”,下载“arthas-idea”插件,如下图所示:
在这里插入图片描述
在这里插入图片描述

使用步骤

  1. 将arthas包复制到服务器;
  2. 查找对应java服务的进程号;
[root@host-10-19-141-49 hik]# lsof -i:8041
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Jsvc 60164 root 398u IPv4 2662812937 0t0 TCP *:8041 (LISTEN)
  1. 执行以下命令,进入arthas命令界面;
  2. 选择对应的进程号(输入数字,选择具体的进程号);

常用基础命令:

help——查看命令帮助信息

cat——打印文件内容,和 linux 里的 cat 命令类似

pwd——返回当前的工作目录,和 linux 命令类似

cls——清空当前屏幕区域

session——查看当前会话的信息

reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所

有增强过的类

version——输出当前目标 Java 进程所加载的 Arthas 版本号

history——打印命令历史

quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出

keymap——Arthas 快捷键列表及自定义快捷键

sysenv: Display the system env.

sysprop: Display, and change the system properties

reset: Reset all the enhanced classes

dump: Dump class byte array from JVM

options: View and change various Arthas options

getstatic Show the static field of a class

sc: Search all the classes loaded by JVM

sm: Search the method of classes loaded by JVM

classloader: Show classloader info

dashboard:显示出线程(按照 cpu 占用百分比倒排)、内存(堆空间实时情况)、GC

情况等数据

在这里插入图片描述

thread:用来查看当前 jvm 中的线程信息.

在这里插入图片描述

jvm:查看当前 jvm 信息

在这里插入图片描述

watch:能方便的观察到指定方法的调用情况,返回值、抛出异常、入参(特殊值、异常没有捕获排查)

watch [class-pattern] [method-pattern] [express] params

其中class-pattern为类名的表达式,method-pattern为方法名表达式,express为观察表达式,
params是可以添加的一些参数信息。具体可查看官方文档。
在使用Arthas前,定位排查数据问题主要有两种方式:

  • 日志:排查前需要写入日志代码,重新打包部署,不适合生产环境。
  • 远程Debug:需开设debug端口,安全性差,阻塞环境中的应用程序,对使用的其他人员产生影响,不利于合作。

而使用Arthas定位问题,对环境几乎无影响,定位效率高。

示例:

watch com.hikvision.omcmdb.web.model.ModelRestful deleteModelCategory 
'{params,returnObj,throwExp}' -n 5 -x 3 

-n 5 表示只执行五次,防止被刷屏
-x 2 来指定打印对象的属性遍历深度
在这里插入图片描述

trace:方法内部调用路径,并输出方法路径上的每个节点上耗时(性能问题,调用链问题)

trace命令查看方法内部的调用路径,并且可以查看每个路径上的耗时。其使用方式如下:

trace [class-pattern] [method-pattern] [condition-express] params

其中class-pattern为类名的表达式,method-pattern为方法名表达式,condition-express为条件表达式,params是可以添加的一些参数信息。具体可查看官方文档。
下面为一次使用trace命令定位接口超时问题实例

示例2
下面为一次使用trace命令定位接口超时问题实例:
一次通过F12发现控制台一个接口很长时间没有响应数据,该接口用于查看工单的待办数量,于是使用
trace命令监控该接口如下图所示:

在这里插入图片描述
可以看到方法内部调用OrderCommonService.orderStatistics()方法时耗时了60秒之多,严重超时了,
于是继续使用trace命令监控OrderCommonService.orderStatistics()方法进一步定位超时位置,如此方
式,最终定位出是由于调用HOSP的查询用户区域权限方法引发的超时。整个过程图如下所示:
在这里插入图片描述
在这里插入图片描述

trace com.hikvision.omcmdb.web.model.ModelRestful deleteModelCategory -n 5 --
skipJDKMethod false

在这里插入图片描述

monitor:方法执行监控(性能问题排查,一段时间内的性能指标) 统计每个接口的运行情况

$ monitor -c 5
com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl.DeployFace
XRestServiceImpl saveDeployFaceDetailInfo
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 156 ms.
timestamp class
method total success fail
avg-rt(ms) fail-rate
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
------------------------
2019-08-20 09:18:13
com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl.DeployFace
XRestServiceImpl saveDeployFaceDetailInfo 1 1 0 9.01 0.00%
timestamp class
method total success fail
avg-rt(ms) fail-rate
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
------------------------
2019-08-20 09:18:18
com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl.DeployFace
XRestServiceImpl saveDeployFaceDetailInfo 1 1 0 2.81 0.00%
timestamp class
method total success fail
avg-rt(ms) fail-rate
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
------------------------
2019-08-20 09:18:23
com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl.DeployFace
XRestServiceImpl saveDeployFaceDetailInfo 0 0 0 0.00 0.00%
timestamp class
method total success fail
avg-rt(ms) fail-rate
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
------------------------
2019-08-20 09:18:28
com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl.DeployFace
XRestServiceImpl saveDeployFaceDetailInfo 1 1 0 2.54 0.00%

stack:获取方法从哪里执行的调用栈(用途:源码学习调用堆栈,了解调用流程) 查看方法的调用路径

stack
com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl.DeployFace
XRestServiceImpl saveDeployFaceDetailInfo
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 147 ms.
ts=2019-08-20 09:14:29;thread_name=XNIO-2 task-
125;id=101;is_daemon=false;priority=5;TCCL=org.springframework.boot.loader.LaunchedURL
ClassLoader@55183b20
@com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl.DeployFac
eXRestServiceImpl.saveDeployFaceDetailInfo()
at
sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140)
at
org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.jav
a:294)
at
org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:248)
at
org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:235)
at
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:402)
at
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:209)
at
org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletCo
ntainerDispatcher.java:227)
at
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDis
patcher.java:56)
at
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDis
patcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at
io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java
:129)
at
org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(Ap
plicationContextHeaderFilter.java:55)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java
:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java
:131)
at
org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebReque
stTraceFilter.java:111)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java
:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java
:131)
at
org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFil
ter.java:99)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java
:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java
:131)
at
org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormCo
ntentFilter.java:109)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java
:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java
:131)
at
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMetho
dFilter.java:93)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java
:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java
:131)
at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncod
ingFilter.java:197)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java
:107)

tt:方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并

能对这些不同的时间下调用进行观测

jad 反编译具体类

jad
com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl.DeployFace
XRestServiceImpl
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@c387f44
+-sun.misc.Launcher$ExtClassLoader@56de6d6b
Location:
/opt/opsmgr/web/components/xalarm.1/bin/xalarm-acs/lib/xalarm-acs-provider-
1.1.1000.RELEASE.jar
/*
* Decompiled with CFR 0_132.
*/
package com.hikvision.ga.xalarm.acs.modules.provider.balarm.api.deploy.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hikvision.ga.common.BasePage;
import com.hikvision.ga.common.BaseResult;
import com.hikvision.ga.common.BusinessException;
import com.hikvision.ga.logger.build.HikGaLoggerFactory;
import com.hikvision.ga.logger.log.HikGaLogger;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.dto.DeployFaceDTO;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.dto.DeployFaceForm;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.dto.ResourceDto;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.mapper.entity.DeployFace;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.query.dto.CondiFaceLibDTO;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.res.dto.DynTreeNode;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.res.dto.FaceScopeCheck;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.res.dto.Result4FaceLibDTO;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.res.dto.TreeNodeParams;
import com.hikvision.ga.xalarm.acs.balarm.api.deploy.service.DeployFaceXRestService;
import com.hikvision.ga.xalarm.acs.modules.deploy.service.DeployFaceBackIacService;
import com.hikvision.ga.xalarm.acs.modules.deploy.service.DeployFaceService;
import com.hikvision.ga.xalarm.acs.modules.deploy.service.DeployFaceSuperBrainService;
import com.hikvision.ga.xalarm.acs.modules.deploy.service.DeployService;

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

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

相关文章

卸载软件最最最彻底的工具——Uninstall Tool

卸载软件最最最彻底的工具——Uninstall Tool Uninstall Tool 是一款功能强大的专业卸载工具。针对一些普通卸载不彻底的问题,它可以做到最优,比如Matlab等软件的卸载难的问题也可以较好地解决。 它比 Windows 自带的“添加/删除程序”功能快 3 倍&…

深度学习:全面了解深度学习-从理论到实践

深度学习:全面了解深度学习-从理论到实践 摘要:本文旨在为读者提供一份全面的深度学习指南,从基本概念到实际应用,从理论数学到实践技术,带领读者逐步深入了解这一领域。我们将一起探讨深度学习的历史、发展现状&#…

算法通关第十七关青铜挑战——原来贪心如此简单(什么是贪心思想and经典例题分析)

大家好,我是怒码少年小码。 一转眼,又到了11月末尾了,莫名感觉今年真的很快😂。今天的主角是贪心。 贪心的思想非常不好解释,而且越使用权威的语言解释越难懂。而且做题的时候根据自己的理解可能直接做出来&#xff…

Ubuntu 22.03 LTS 安装deepin-terminal 分屏

安装 源里面自带了这个软件,可以直接装 sudo apt install deepin-terminal 启动 按下Win键,输入deep即可快速检索出图标,点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口,鼠标点击可以切换…

C#常见的设计模式-结构型模式

引言 设计模式是软件工程中用于解决常见问题的可复用解决方案。在C#编程中,常见的设计模式具有广泛的应用。本篇博客将重点介绍C#中常见的结构型设计模式,包括适配器模式、装饰器模式、代理模式、组合模式和享元模式。 目录 引言1. 适配器模式(Adapter …

便利高效双赢:无人机油气管道巡检全面升级

我国庞大的油气管道网络,包括原油、成品和天然气管道,因为地理区域广泛、建设年代久远、安全事故频发等现实因素,对管道的安全巡护与管理提出了更高的需求。在这一背景下,传统的人工巡护方式显然已经难以满足对高、精、准的要求。…

【受体 + 二系统 】

GPCR A级超家族家庭成员/基因评论胺受体受体的六个亚家族总共包括45个基因(其中4个是假基因);这六个亚家族是5-羟色胺(5-HT,血清素)受体(13个基因),多巴胺受体(5个基…

瑞数五代ast反混淆笔记一

第一部分 瑞数五代ast反混淆笔记一 文章目录 前言一、分析第一层js文件二、转换为switch-case三、效果图总结 前言 瑞数五代的反混淆做了很久了,当时写的很复杂,也没有记笔记,现在看代码都看不懂了,重新归顺下逻辑思路 一、分析第…

Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换

我们已经执行了 Bitcoin SV 和 Bitcoin Core 之间的首次原子交换。 这一成就代表了比特币 SV 的重大进步,以去信任的方式促进了与其他区块链的无缝互操作性。 图片源自Gemini 在上一篇文章中,我们解释了原子交换的高级理论。 我们深入研究了使用哈希时间…

供配电系统智能化监控

供配电系统智能化监控是指利用先进的监测技术、自动化控制技术、计算机网络技术等,对供配电系统进行实时、全方位的监测和控制,以实现供配电系统的安全、稳定、高效运行。 供配电系统智能化监控的主要功能包括: 实时数据采集:通过…

C语言WFC绘制矩形

代码实现: void CCGDrawingView::Rectangle(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, COLORREF color,CDC* pDC) {CPen redPen(PS_SOLID, 1, color);CBrush redBursh(color);CPen* pOldPen pDC->SelectObject(&redPen);CBrush* p…

十八数字文化受邀参加版博会“区块链+版权”创新应用试点研讨会

2023年11月23日至25日,以“版权新时代 赋能新发展”为主题的第九届中国国际版权博览会在成都市中国西部国际博览城和天府国际会议中心举办。版博会是我国版权领域唯一的综合性、国际性、国家级版权专业博览会,本届版博会由国家版权局主办,四川…

双十一备战与复盘

如何组织备战 重要节点 从大促启动会开始后我就开始计划我们本次备战的整体节奏。 挑战在哪 以上内容介绍了CDP平台有多么重要,那么画像系统备战的核心挑战在“如何保障在大流量高并发情况下系统稳定提供高性能服务”,主要表现在:稳定性、…

【GO】k8s 管理系统项目16[前端部分--项目初始化]-学习记录

学习链接 https://blog.csdn.net/qq_29974229/article/details/129119279?spm1001.2014.3001.5502 nvm use v16.15.0 npm install vue -g npm install -g vue/clivue create k8s-plantform-fe选择 Default cd k8s-plantform-fe npm run servecd ./src mkdir views mkdir r…

ESXi 6.7 升级 7.0

方式一:esxcli方式 1.登陆exsi web界面。 启用控制台shell 2.存储-datastore-数据存储浏览器,上载 ESXI-7.0.0-depot.zip升级文件。记住此datastore的位置 ssh连接ESXI主机 vmware -vl 查看当前版本 查看升级包中对应的版本信息: es…

长沙市中小学入学报名流程及上传证件照电子版制作方法

长沙市中小学入学报名是家长和学生迈向教育之门的第一步。通常,报名过程分为线上和线下两个阶段。首先,家长需在规定时间内登录报名系统,填写详细的入学信息等。长沙市注重教育公平,为确保每个孩子都有平等的入学机会,…

(六)上市企业实施IPD成功案例分享之——中兴通讯

在通信业,项目交付的质量和效率,很大程度上影响着运营商的竞争力,先进的项目管理理念、数字化的项目管理工具及丰富的实践经验,是运营商选择合作伙伴的主要维度。在中国,IPD之所以名气这么大,最大的原因就是…

【全新升级】:Word、Excel和PPT批量转PDF - PyQt设计

文章目录 ✨前言✨脚本使用教程📚资源领取(含源代码) ✨前言 最近花了十几天的时间学习了PyQt的使用,发现PyQt具有丰富的特性和功能,可以创建出漂亮、交互性强的GUI应用程序,而且还可通过CSS样式表来设计界…

C语言:编程实现1!+2!+3!+4!+……+n!

分析&#xff1a; #include<stdio.h>//这是一个预处理指令&#xff0c;将stdio.h头文件包含到程序中&#xff0c;以便使用输入输出函数。 int main()//这是程序的主函数&#xff0c;是程序执行的入口点。 int i, a 1, t 0, n;//定义了整型变量i、a、t和n。其中&#x…

viple模拟器使用(二):Web 2D模拟器中实现沿右墙迷宫算法

沿右墙迷宫算法原理 默认直行&#xff1b;右侧有路&#xff0c;则右转&#xff1b;前方无路&#xff0c;则左转。 使用了2个传感器&#xff0c;分别是&#xff1a;机器人右侧的距离传感器 、前方的触觉传感器。 按照逻辑&#xff0c;程序中需要左转&#xff08;Left90&#xf…