Arthas sm(查看已加载类的方法信息 )

在这里插入图片描述

文章目录

  • 二、命令列表
    • 2.2 class/classloader相关命令
      • 2.2.6 sm(查看已加载类的方法信息 )
        • 举例1:显示类加载的方法
        • 举例2:显示类加载的executeTask方法详细信息
  • 本人其他相关文章链接

二、命令列表

2.2 class/classloader相关命令

2.2.6 sm(查看已加载类的方法信息 )

提示:

“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。

sm 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到。

参数说明:

参数名称参数说明
class-pattern类名表达式匹配
method-pattern方法名表达式匹配
[d]展示每个方法的详细信息
[E]开启正则表达式匹配,默认为通配符匹配
[c:]指定 class 的 ClassLoader 的 hashcode
[classLoaderClass:]指定执行表达式的 ClassLoader 的 class name
[n:]具有详细信息的匹配类的最大数量(默认为 100

问题:这sm方法有啥用?我只能看出方法入参类型 返回类型等等,你又看不到具体的代码逻辑 感觉没用啊

答案:用途和好处

  1. 了解方法签名sm 命令帮助你快速了解某个方法的签名信息。这包括方法的返回类型、参数类型以及访问修饰符(如 public, private, static 等)。这对于你在调试时确认方法调用的正确性非常重要。
  2. 方法元数据:通过 sm -d 命令,可以获取更详细的方法元数据,包括方法的声明类、修饰符、注解、异常等。这有助于了解方法的具体定义和它的上下文。
  3. 分析方法的调用:虽然 sm 命令不显示具体的代码逻辑,但了解方法的签名可以帮助你在其他调试任务中更好地理解方法的作用和调用。例如,在使用 monitortrace 等命令时,你可以基于方法的签名来确认你正在监控或追踪正确的方法。
  4. 验证方法的存在:你可以使用 sm 命令验证一个类中是否存在某个方法,以及它的参数和返回类型是否符合你的预期。这在检查类的正确性或调试异常时非常有用。
  5. 调试和分析:在进行性能调优或分析时,了解方法的签名有助于你识别方法调用的瓶颈,或者确认方法是否按预期工作。

代码:

public class SMTaskCache
{private static SMTaskCache instance = new SMTaskCache();// 缓存public static final Vector<SmconfigDmTaskMain> taskCache = new Vector<>();// 读写锁private final static ReadWriteLock lock = new ReentrantReadWriteLock();public static SMTaskCache getInstance(){return instance;}private SMTaskCache(){}/*** 向缓存中添加对象* @param info*/public static void add(SmconfigDmTaskMain info){try{lock.writeLock().lock();for (SmconfigDmTaskMain smconfigdmtaskmain : taskCache){if (smconfigdmtaskmain.getSysTaskId().equals(info.getSysTaskId())){taskCache.remove(smconfigdmtaskmain);break;}}taskCache.add(info);}finally{lock.writeLock().unlock();}}/*** 向缓存中添加对象* @param infos*/@Autowiredpublic static void add(List<SmconfigDmTaskMain> infos){try{lock.writeLock().lock();for (SmconfigDmTaskMain info : infos){add(info);}}finally{lock.writeLock().unlock();}}/*** 从缓存中删除对象* @param sysTaskId*/public static void remove(Long sysTaskId){try{lock.writeLock().lock();if (taskCache.size() > 0){for (SmconfigDmTaskMain smconfigdmtaskmain : taskCache){if (smconfigdmtaskmain.getSysTaskId().equals(sysTaskId)){taskCache.remove(smconfigdmtaskmain);return;}}}}finally{lock.writeLock().unlock();}}/*** 获取task状态* @param smconfigdmtaskmain* @return*/public static SmconfigDmTaskMain getTaskStatus(SmconfigDmTaskMain smconfigdmtaskmain){try{lock.readLock().lock();for (SmconfigDmTaskMain taski : taskCache){if (taski.getSysTaskId().equals(smconfigdmtaskmain.getSysTaskId())){smconfigdmtaskmain.setSysTaskState(taski.getSysTaskState());smconfigdmtaskmain.setSysTaskNextTime(taski.getSysTaskNextTime());smconfigdmtaskmain.setTaskSwitch(taski.getTaskSwitch());}}return smconfigdmtaskmain;}finally{lock.readLock().unlock();}}/*** 获取task状态* @param smconfigdmtaskmains* @return*/public static List<SmconfigDmTaskMain> getTaskStatus(List<SmconfigDmTaskMain> smconfigdmtaskmains){try{lock.readLock().lock();for (SmconfigDmTaskMain smconfigdmtaskmain : smconfigdmtaskmains){getTaskStatus(smconfigdmtaskmain);}return smconfigdmtaskmains;}finally{lock.readLock().unlock();}}/*** 初始化task状态* @param sysTaskId* @param nextTime*/public static void initTask(Long sysTaskId, Date nextTime, Integer taskSwitch){try{lock.writeLock().lock();Long curTime = System.currentTimeMillis();for (SmconfigDmTaskMain smconfigdmtaskmain : taskCache){if (smconfigdmtaskmain.getSysTaskId().equals(sysTaskId)){//如果当前任务有结束时间,需要判断任务是否已经过期if(smconfigdmtaskmain.getSysTaskEndTime() != null && smconfigdmtaskmain.getSysTaskEndTime().getTime() <= curTime){smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.PASTDUE.getCodeString());smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.INVALID.getCode());}else if(SMTaskSwitchEnum.INVALID.getCode().equals(taskSwitch)){smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.PAUSE.getCodeString());smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.INVALID.getCode());}else{smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.READY.getCodeString());smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.ACTIVE.getCode());}smconfigdmtaskmain.setSysTaskNextTime(nextTime);}}}finally{lock.writeLock().unlock();}}/*** 更新task状态为暂停* @param sysTaskId*/public static void pasueTask(Long sysTaskId){try{lock.writeLock().lock();Long curTime = System.currentTimeMillis();for (SmconfigDmTaskMain smconfigdmtaskmain : taskCache){if (smconfigdmtaskmain.getSysTaskId().equals(sysTaskId)){//如果当前任务有结束时间,需要判断任务是否已经过期if(smconfigdmtaskmain.getSysTaskEndTime() != null && smconfigdmtaskmain.getSysTaskEndTime().getTime() <= curTime){smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.PASTDUE.getCodeString());smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.INVALID.getCode());}else {smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.PAUSE.getCodeString());smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.INVALID.getCode());}}}}finally{lock.writeLock().unlock();}}/*** 开始任务* @param sysTaskId* @param nextTime*/public static void executeTask(Long sysTaskId, Date nextTime){try{lock.writeLock().lock();Long curTime = System.currentTimeMillis();for (SmconfigDmTaskMain smconfigdmtaskmain : taskCache){if (smconfigdmtaskmain.getSysTaskId().equals(sysTaskId)){//如果当前任务有结束时间,需要判断任务是否已经过期if(smconfigdmtaskmain.getSysTaskEndTime() != null && smconfigdmtaskmain.getSysTaskEndTime().getTime() <= curTime){smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.PASTDUE.getCodeString());smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.INVALID.getCode());}else{smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.EXECUTING.getCodeString());smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.ACTIVE.getCode());}smconfigdmtaskmain.setSysTaskNextTime(nextTime);}}}finally{lock.writeLock().unlock();}}/*** 结束任务* @param sysTaskId 任务ID* @param externalCallFlag 【true:为外部接口curl命令调用;false:系统任务内部调用】*/public static void executeTaskEnd(Long sysTaskId, boolean externalCallFlag){//如果externalCallFlag为true,则不修改系统任务的状态,直接跳过if (externalCallFlag) {return;}try{lock.writeLock().lock();Long curTime = System.currentTimeMillis();for (SmconfigDmTaskMain smconfigdmtaskmain : taskCache){if (smconfigdmtaskmain.getSysTaskId().equals(sysTaskId)){//如果当前任务有结束时间,需要判断任务是否已经过期if(smconfigdmtaskmain.getSysTaskEndTime() != null && smconfigdmtaskmain.getSysTaskEndTime().getTime() <= curTime){smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.PASTDUE.getCodeString());smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.INVALID.getCode());}else{smconfigdmtaskmain.setTaskSwitch(SMTaskSwitchEnum.ACTIVE.getCode());smconfigdmtaskmain.setSysTaskState(SMTaskStatusEnum.READY.getCodeString());}}}}finally{lock.writeLock().unlock();}}
}
举例1:显示类加载的方法

基础语法

sm 全路径类名

[arthas@18139]$ sm com.hero.lte.ems.sysmanager.cache.SMTaskCache
com.hero.lte.ems.sysmanager.cache.SMTaskCache <init>()V
com.hero.lte.ems.sysmanager.cache.SMTaskCache executeTask(Ljava/lang/Long;Ljava/util/Date;)V
com.hero.lte.ems.sysmanager.cache.SMTaskCache getTaskStatus(Lcom/hero/lte/ems/sysmanager/model/SmconfigDmTaskMain;)Lcom/hero/lte/ems/sysmanager/model/SmconfigDmTaskMain;
com.hero.lte.ems.sysmanager.cache.SMTaskCache getTaskStatus(Ljava/util/List;)Ljava/util/List;
com.hero.lte.ems.sysmanager.cache.SMTaskCache initTask(Ljava/lang/Long;Ljava/util/Date;Ljava/lang/Integer;)V
com.hero.lte.ems.sysmanager.cache.SMTaskCache pasueTask(Ljava/lang/Long;)V
com.hero.lte.ems.sysmanager.cache.SMTaskCache executeTaskEnd(Ljava/lang/Long;Z)V
com.hero.lte.ems.sysmanager.cache.SMTaskCache add(Lcom/hero/lte/ems/sysmanager/model/SmconfigDmTaskMain;)V
com.hero.lte.ems.sysmanager.cache.SMTaskCache add(Ljava/util/List;)V
com.hero.lte.ems.sysmanager.cache.SMTaskCache remove(Ljava/lang/Long;)V
com.hero.lte.ems.sysmanager.cache.SMTaskCache getInstance()Lcom/hero/lte/ems/sysmanager/cache/SMTaskCache;
Affect(row-cnt:11) cost in 18 ms.
[arthas@18139]$
举例2:显示类加载的executeTask方法详细信息

基础语法

sm -d 全路径类名 方法名

[arthas@18139]$ sm -d com.hero.lte.ems.sysmanager.cache.SMTaskCache executeTaskdeclaring-class  com.hero.lte.ems.sysmanager.cache.SMTaskCache                                                                                                                                                                         method-name      executeTask                                                                                                                                                                                                           modifier         public,static                                                                                                                                                                                                         annotation                                                                                                                                                                                                                             parameters       java.lang.Long                                                                                                                                                                                                        java.util.Date                                                                                                                                                                                                        return           void                                                                                                                                                                                                                  exceptions                                                                                                                                                                                                                             classLoaderHash  18b4aac2                                                                                                                                                                                                              Affect(row-cnt:1) cost in 15 ms.
[arthas@18139]$ 

本人其他相关文章链接

1.Arthas 全攻略:让调试变得简单
2.Arthas dashboard(当前系统的实时数据面板)
3.Arthas thread(查看当前JVM的线程堆栈信息)
4.Arthas jvm(查看当前JVM的信息)
5.Arthas sysprop(查看和修改JVM的系统属性)
6.Arthas sysenv(查看JVM的环境变量)
7.Arthas vmoption(查看和修改 JVM里诊断相关的option)
8.Arthas getstatic(查看类的静态属性 )
9.Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
10.Arthas logger(查看 logger 信息,更新 logger level)
11.Arthas mbean(查看 Mbean 的信息)
12.Arthas memory(查看 JVM 内存信息)
13.Arthas ognl(执行ognl表达式)
14.Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)
15.Arthas vmtool(从 jvm 里查询对象,执行 forceGc)
16.Arthas jad(字节码文件反编译成源代码 )
17.Arthas mc(Memory Compiler/内存编译器 )
18.Arthas redefine(加载外部的.class文件,redefine到JVM里 )
19.Arthas classloader (查看 classloader 的继承树,urls,类加载信息)
20.Arthas sc(查看JVM已加载的类信息 )
21.Arthas sm(查看已加载类的方法信息 )
22.Arthas monitor(方法执行监控)
23.Arthas stack (输出当前方法被调用的调用路径)
24.Arthas trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)
25.Arthas tt(方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测)
26.Arthas watch (方法执行数据观测)
27.Arthas profiler(使用async-profiler对应用采样,生成火焰图)

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

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

相关文章

如何使用SCCMSecrets识别SCCM策略中潜在的安全问题

关于SCCMSecrets SCCMSecrets是一款针对SCCM策略的安全扫描与检测工具&#xff0c;该工具旨在提供一种有关 SCCM 策略的全面安全检测方法。 该工具可以从各种权限级别执行&#xff0c;并将尝试发现与策略分发相关的潜在错误配置。除了分发点上托管的包脚本外&#xff0c;它还将…

如何让每一次销售都成为顾客心中的温馨记忆

舒适&#xff0c;乃交往之至高艺术&#xff0c;亦渗透于买卖交易的每一环节。 在这个体验为王的时代&#xff0c;消费者追求的早已超越了物质本身&#xff0c;转而寻觅那份独特的“心灵触动”。他们购买的&#xff0c;实则是一种情感的共鸣&#xff0c;一种被重视与信赖的“感觉…

分糖果C++

题目&#xff1a; 样例解释&#xff1a; 样例1解释 拿 k20 块糖放入篮子里。 篮子里现在糖果数 20≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 13≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 6<n7&#xf…

git 报错git: ‘remote-https‘ is not a git command. See ‘git --help‘.

报错内容 原因与解决方案 第一种情况&#xff1a;git路径错误 第一种很好解决&#xff0c;在环境变量中配置正确的git路径即可&#xff1b; 第二种情况 git缺少依赖 这个情况&#xff0c;网上提供了多种解决方案。但如果比较懒&#xff0c;可以直接把仓库地址的https改成ht…

Python从0到100(六十):机器学习-模型选择与交叉验证

1、为什么需要交叉验证 交叉验证目的&#xff1a;为了让被评估的模型更加准确可信 在机器学习中&#xff0c;模型的性能评估至关重要。如果仅使用训练数据进行模型训练&#xff0c;然后直接在测试集上进行评估&#xff0c;可能会出现模型对训练数据过拟合的问题。过拟合的模型…

python7_标识符

标识符 关键字 说明 1和java一样&#xff0c;python也有关键字&#xff0c;不允许以以下字段作为方法名和类名 2标识符是区分大小写的&#xff0c;例如A和a是不一样的 3标识符第一个数字必须是字母或者下划线&#xff0c;之后可以是字母、数字、下划线 4以双下划线开头或者结…

828华为云征文|华为云 Flexus X 实例初体验

一直想有自己的一款的服务器&#xff0c;为了更好的进行家庭娱乐&#xff0c;甚至偶尔可以满足个人搭建开发环境的需求&#xff0c;直到接触到了华为云 Flexus X 云服务器。Flexus 云服务器 X 实例是面向中小企业和开发者打造的轻量级云服务器。提供快速应用部署和简易的管理能…

第二届两岸新经济产业发展研讨会闭幕,爱迪斯通董事长发表演讲

9月29日&#xff0c;第二届两岸新经济产业发展研讨会在福州高新区圆满落幕。此次研讨会由清华大学两岸发展研究院主办&#xff0c;福州市招商行动领导小组办公室、福州高新区承办&#xff0c;汇聚了两岸的专家学者及企业家代表近200人&#xff0c;共同探讨新质生产力的发展与两…

3.4K Star,你的下一个商店

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 在当今电商高速发展的时代&#xff0c;商家和开发者都在寻找更加灵活…

【论文导读】Graphusion (LLM + KGC)

序言 第一次论文出现在 《Leveraging Large Language Models for Concept Graph Recovery and Question Answering in NLP Education》 论文地址&#xff1a;https://arxiv.org/abs/2402.14293 七月份的时候应该是又改进了一次。但是又发了一篇新的地址&#xff1a;《Graphu…

Java应用程序的服务器有哪些?

1.Tomcat、Jetty 和 JBoss 区别&#xff1f; Apache Tomcat、Jetty 和 JBoss都是用于部署Java应用程序的服务器&#xff0c;它们都支持Servlet、JSP和其他Java EE&#xff08;现在称为Jakarta EE&#xff09;技术。尽管它们有一些相似的功能&#xff0c;但它们之间还是存在一些…

golang小项目1-家庭收支记账系统

项目地址&#xff1a;golang小项目 参考资料&#xff1a;尚硅谷golang教程P229 家庭收支记账系统 1. 系统简介 1.1 项目背景 在现代社会中&#xff0c;家庭的财务管理显得尤为重要。随着生活成本的不断上升&#xff0c;家庭需要有效地记录和分析收支情况&#xff0c;以确保…

网上租赁系统开发:SpringBoot实践与应用

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…

OpenGL ES 着色器(5)

OpenGL ES 着色器(5) 简述 着色器是在GPU上运行的程序&#xff0c;它会对每一个点都执行一次程序&#xff0c;并且计算出每个像素需要渲染的颜色&#xff0c;我们主要关注着色器的怎么传递数据&#xff0c;在OpenGL ES中&#xff0c;着色器传递数据分几种场景&#xff0c;一种…

简单线性回归分析-基于R语言

本题中&#xff0c;在不含截距的简单线性回归中&#xff0c;用零假设对统计量进行假设检验。首先&#xff0c;我们使用下面方法生成预测变量x和响应变量y。 set.seed(1) x <- rnorm(100) y <- 2*xrnorm(100) &#xff08;a&#xff09;不含截距的线性回归模型构建。 &…

一篇文章快速学会docker容器技术

目录 一、Docker简介及部署方法 1.1Docker简介 1.1.1什么是docker 1.1.2 docker在企业中的应用场景 1.1.3 docker与虚拟化的对比 1.1.4 docker的优势 二 、部署docker 2.1 容器工作方法 2.2 部署第一个容器 2.2.1 配置软件仓库 2.2.2 安装docker-ce并启动服务 2.2.…

B2B商城交易解决方案:赋能企业有效重塑采购与销售新生态

在电商零售领域&#xff0c;商城系统始终是企业搭建商城的关键利器。 伴随着电商行业的蓬勃发展&#xff0c;各类新模式层出不穷&#xff0c;各种商城系统也应运而生&#xff0c;其中B2B商城更是最为常见的一种。 近年来&#xff0c;得益于电子商务的迅猛发展&#xff0c;B2B商…

宿州儿童自闭症寄宿制学校:培养孩子独立能力的专业机构

在探索自闭症儿童教育的广阔领域里&#xff0c;宿州儿童自闭症寄宿制学校以其专业的教育模式和显著的成效&#xff0c;为众多家庭带来了希望。然而&#xff0c;当我们把目光投向中国南方的繁华都市——广州&#xff0c;会发现另一所同样在自闭症儿童教育领域深耕多年、成果显著…

python如何判断图片路径是否存在

1、在向文件夹中保存数据前&#xff0c;先判断该文件夹(路径)是否存在。 save_path /root/.../image/result if not os.path.exists(save_path):os.makedirs(save_path) 本来路径里只有到image文件夹的&#xff0c;执行完后会自动在image下创建result文件夹。 2、在打开某些图…

一款好用的图像处理软件:Photoshop

Photoshop 常被简称为PS&#xff0c;是图像处理领域里最常用也是很重要的一个工具。在平面广告设计、印刷出版等各领域有有着重要的作用。利用Photoshop图像处理软件&#xff0c;可以设计制作报纸、杂志、书籍、招贴广告、海报、建筑效果图、网页等各种精美的作品&#xff0c;普…