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

news2024/11/17 11:31:17

在这里插入图片描述

文章目录

  • 二、命令列表
    • 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
     */
    @Autowired
    public 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 executeTask
 declaring-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]$ 

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

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

相关文章

MySQL - 进阶篇

一、存储引擎 1. MySQL体系结构 2. 存储引擎简介 3. 存储引擎特点 4. 存储引擎选择 二、索引 1. 索引概述 2. 索引结构 3. 索引分类 4. 索引语法 5. SQL性能分析 6. 索引使用 7. 索引设计原则 三、SQL优化 1. 插入数据 2. 主键优化 3. order by优化 4. group by优化 5. limi…

数据结构:串 及串的模式匹配(KMP)

串的定义 串&#xff08;String&#xff09;是由零个或多个字符组成的有限序列&#xff0c;又名叫字符串。在计算机科学中&#xff0c;串是一种重要的数据结构&#xff0c;用于表示文本数据。串中的元素称为字符&#xff0c;字符可以是字母、数字或其他符号&#xff0c;这些字…

【LeetCode: 227. 基本计算器 II + 栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

C++ | Leetcode C++题解之第445题两数相加II

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {stack<int> s1, s2;while (l1) {s1.push(l1 -> val);l1 l1 -> next;}while (l2) {s2.push(l2 -> val);l2 l2 -> next;}int carry 0;L…

STM32-HAL库驱动DHT11温湿度传感器 --2024.9.28

目录 一、教程简介 二、驱动原理讲解 &#xff08;一&#xff09;通信4步骤 &#xff08;二&#xff09;传感器数据解析 三、CubeMX生成底层代码 &#xff08;一&#xff09;基础配置 &#xff08;二&#xff09;配置DHT11的驱动引脚 &#xff08;三&#xff09;配置串口 四…

基于webComponents的纯原生前端框架

我本人的个人开发web前端前框架xui&#xff0c;正在开发中&#xff0c;业已完成50%的核心开发工作&#xff0c;并且在开发过程中逐渐完善. 目前框架未采用任何和市面上框架模式&#xff0c;没有打包过程&#xff0c;实现真实的开箱即用。 当然在开发过程中也会发现没有打包工…

二阶低通滤波器Simulink仿真测试

1、如何将S域传递函数转为Z域传递函数 传递函数如何转化为差分方程_非差分方程转成差分方程-CSDN博客文章浏览阅读4.1k次,点赞4次,收藏50次。本文介绍了如何将传递函数转化为差分方程,主要适用于PLC和嵌入式系统。通过MATLAB的系统辨识工具箱获取传递函数,并探讨了离散化方…

通义灵码【最佳编程实践】说明

通义灵码是JetBrains或VSCode集成开发环境&#xff08;IDE&#xff09;中嵌入的一款智能开发助手工具&#xff0c;旨在通过人工智能技术简化软件开发过程&#xff0c;提升开发效率。本文将介绍在开发过程中如何深度体验多种辅助功能。其主要功能包括&#xff1a;通用大模型问答…

AdaptIoT——制造业中使用因果关系的自我标签系统

0.概述 论文地址&#xff1a;https://arxiv.org/abs/2404.05976 在许多制造应用中&#xff0c;机器学习&#xff08;ML&#xff09;已被证明可以提高生产率。针对制造业应用提出了一些软件和工业物联网&#xff08;IIoT&#xff09;系统&#xff0c;以接收这些 ML 应用。最近&…

2-仙灵之谜(安装钱包及添加网络)

2-仙灵之谜&#xff08;安装钱包及添加网络&#xff09; 前言&#xff08;该游戏仅供娱乐&#xff09;正文 前言&#xff08;该游戏仅供娱乐&#xff09; 新部署的相关链接如下 游戏访问地址&#xff1a;   http://8.130.162.58/ RPC网络&#xff1a;   网络名称 &#xf…

目前最好用的爬虫软件是那个?

作为一名数据工程师&#xff0c;三天两头要采集数据&#xff0c;用过十几种爬虫软件&#xff0c;也用过Python爬虫库&#xff0c;还是建议新手使用现成的软件比较方便。 这里推荐3款不错的自动化爬虫工具&#xff0c;八爪鱼、亮数据、Web Scraper 1. 八爪鱼爬虫 八爪鱼爬虫是一…

尚硅谷vue3+TypeScript笔记大全

源码及视频&#xff1a;通过百度网盘分享的文件&#xff1a;尚硅谷vue3 链接&#xff1a;https://pan.baidu.com/s/19zVM5Xsr1UP7tZ4D0mhVqA?pwdgmta 提取码&#xff1a;gmta 1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piec…

演示:基于WPF的DrawingVisual开发的频谱图和律动图

一、目的&#xff1a;基于WPF的DrawingVisual开发的频谱图和律动图 二、效果演示 波形图 极坐标 律动图极坐标图 律动图柱状图 Dock布局组合效果 三、环境 VS2022,Net7,Win10&#xff0c;NVIDIA RTX A2000 四、主要功能 支持设置起始频率&#xff0c;终止频率&#xff0c;中心…

我把「国产Sora」接入了「小爱」,邀你免费体验

前段时间&#xff0c;搞了个微信 AI 小助理-小爱(AI)&#xff0c;爸妈玩的不亦乐乎。 零风险&#xff01;零费用&#xff01;我把AI接入微信群&#xff0c;爸妈玩嗨了&#xff0c;附教程&#xff08;下&#xff09; 不仅可以智能问答&#xff0c;文生图的能力也接了进来&…

HTML+CSS 水滴登录页

文章目录 一、效果演示二、Code1.HTML2.CSS 三、实现思路拆分 一、效果演示 实现了一个水滴登录页的效果。页面包含一个水滴形状的登录框和两个按钮&#xff0c;登录框包括用户名、密码和登录按钮&#xff0c;按钮分别为忘记密码和注册。整个页面的设计非常有创意&#xff0c;采…

每日一练 2024.9.29(1)

目录 解题思路与代码实现 一、问题分析 二、解题策略 伪代码&#xff1a; 三、代码实现 四、代码解析 五、解题过程总结 六、运行过程示例 示例 1&#xff1a; 示例 2&#xff1a; 七、对比分析 八、改进建议 九、总结 解题思路与代码实现 这道题目要求我们模拟买…

如何解决调试dev-出++5.11不成功问题

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

【CKA】二、节点管理-设置节点不可用

2、节点管理-设置节点不可用 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 先设置节点不可用&#xff0c;然后驱逐节点上的pod 这道题就两条命令&#xff0c;直接背熟就行。 也可以查看帮助 kubectl cordon -h kubectl drain -h 参数详情&#xff1a; –delete-empty…

一个家越来越有钱,是因为女人身上有这3个好习惯!

在一个家庭中&#xff0c;女人往往扮演着举足轻重的角色。 她们不仅是家庭的支柱&#xff0c;也是家庭和谐与繁荣的重要因素。 正所谓“家和万事兴”&#xff0c;一个家庭是否能够兴旺发达&#xff0c;与家中女人的习惯和态度息息相关。 实际上&#xff0c;一个家越来越有钱…

ubuntu20.04安装CUDA与cudnn

这里写目录标题 一、NVIDIA显卡驱动安装二、安装CUDA官网找对应版本下载安装文件安装配置环境变量 三、安装cuDNN选择版本另一种下载方式 四、cuDNN与CUDA关系CUDAcuDNN的依赖关系与CPU的交互开发编程角度图示 总结 一、NVIDIA显卡驱动安装 我这里之前就装好了 使用命令 nvid…