一篇学会Arthas的基本使用及常用指令

  • 使用ognl表达式创建一个对象,并对这个对象进行操作
    • 测试代码
  • public class User {
    
        private Long uid;
    
        private String nickName;
    
       
    
        public User(Long uid, String nickName) {
    
            this.uid = uid;
    
            this.nickName = nickName;
    
        }
    
        public Long getUid() {
    
            return uid;
    
        }
    
        public void setUid(Long uid) {
    
            this.uid = uid;
    
        }
    
        public String getNickName() {
    
            return nickName;
    
        }
    
        public void setNickName(String nickName) {
    
            this.nickName = nickName;
    
        }
    
    }
    • ognl表达式
      • 创建一个对象
  • # 创建一个User对象什么也不做
    
    [arthas@27880]$ ognl 'new com.kerwin.arthas.demo.User(100,"kerwin")'                                             
    
    @User[                                                                                                                       
    
    uid=@Long[100],                                                                                                          
    
    nickName=@String[kerwin],                                                                                            
    
    ]
    
    # 创建一个User对象赋值给user,后续可以在别的地方对创建出来的对象进行操作
    
    [arthas@27880]$ ognl '#user = new com.kerwin.arthas.demo.User(100,"kerwin")'                                             
    
    @User[                                                                                                                       
    
    uid=@Long[100],                                                                                                          
    
    nickName=@String[kerwin],                                                                                            
    
    ]
      • 调用创建出来的对象中的成员方法
  • [arthas@27880]$ ognl 'new com.kerwin.arthas.demo.User(10001,"kerwin").getNickName()'                                     
    
    @String[kerwin]                                                                                          
    
    ]
    
    [arthas@27880]$ ognl '#user = new com.kerwin.arthas.demo.User(10001,"kerwin").getNickName()'                                     
    
    @String[kerwin]                                                                                          
    
    ]
    
    [arthas@27880]$ ognl '#user = new com.kerwin.arthas.demo.User(10001,"kerwin"),#user.getNickName()'                                     
    
    @String[kerwin]                                                                                          
    
    ]
    • 方法复杂入参ognl表达式
      • 测试代码
  • public class OgnlDemo03 {
    
        public static OgnlDemo03 ognlDemo03 = new OgnlDemo03();
    
        private User user;
    
        private static User staticUser;
    
        private static List<String> lists;
    
        private static Map<String,String> maps;
    
    
    
        public User setUser(User user){
    
            this.user = user;
    
            return user;
    
        }
    
        public static User setStaticUser(User user){
    
            OgnlDemo03.staticUser = user;
    
            return user;
    
        }
    
        public static User getMyUser(){
    
           return new User(10002L,"kerwin2");
    
        }
    
        public static User changeUser(User user){
    
            return new User(user.getUid(),user.getNickName()+"---changeUser");
    
        }
    
        public static List<String> setLists(List<String> lists){
    
            OgnlDemo03.lists = lists;
    
            return lists;
    
        }
    
        public static Map<String,String> setMaps(Map<String,String> maps){
    
            OgnlDemo03.maps = maps;
    
            return maps;
    
        }
    
    }
      • 自定义对象入参
        • 创建一个User对象将这个对象作为参数传入静态方法中
  • [arthas@24600]$ ognl '#user = new com.kerwin.arthas.demo.User(10001,"kerwin"),@com.kerwin.arthas.demo.OgnlDemo03@setStaticUser(#user)'                                                                                                             
    
    @User[                                                                                                                       
    
    uid=@Long[10001],                                                                                                        
    
    nickName=@String[kerwin],                                                                                            
    
    ]
        • 创建一个User对象,将这个对象作为参数传入静态属性ognlDemo03对象setUser(user)方法中
  • [arthas@24600]$ ognl '#user = new com.kerwin.arthas.demo.User(10001,"kerwin"),@com.kerwin.arthas.demo.OgnlDemo03@ognlDemo03.setUser(#user)'                                                                                                        
    
    @User[                                                                                                                       
    
    uid=@Long[10001],                                                                                                        
    
    nickName=@String[kerwin],                                                                                            
    
    ]
        • 创建一个User对象,在创建一个OgnlDemo03对象,将创建的User对象传入OgnlDemo03对象的setUser(user)方法
  • [arthas@24600]$ ognl '#user = new com.kerwin.arthas.demo.User(10001,"kerwin"),new com.kerwin.arthas.demo.OgnlDemo03().setUser(#user)'                                                                                                              
    
    @User[                                                                                                                       
    
    uid=@Long[10001],                                                                                                        
    
    nickName=@String[kerwin],                                                                                            
    
    ]
        • 调用getMyUser()方法获取User对象作为changeUser(user)的入参
  • # {#user1,#user2} 代表将user1、user2这两个对象作为数组输出在控制台,因为这里没有加-x 2默认展开层级为1所以输出的是对象内存地址
    
    [arthas@18904]$ ognl '#user1 = @com.kerwin.arthas.demo.OgnlDemo03@getMyUser(),#user2 = @com.kerwin.arthas.demo.OgnlDemo03@changeUser(#user1),{#user1,#user2}'                                                                                      
    
    @ArrayList[                                                                                                                  
    
    @User[com.kerwin.arthas.demo.User@30833e75],                                                                             
    
    @User[com.kerwin.arthas.demo.User@70ca5419],                                                                         
    
    ]
    
    # 加上-x 2 可以展开数组内部对象                                                                                         
    
    [arthas@18904]$ ognl '#user1 = @com.kerwin.arthas.demo.OgnlDemo03@getMyUser(),#user2 = @com.kerwin.arthas.demo.OgnlDemo03@changeUser(#user1),{#user1,#user2}' -x 2                                                                                 
    
    @ArrayList[                                                                                                                  
    
    @User[                                                                                                                       
    
    uid=@Long[10002],                                                                                                        
    
    nickName=@String[kerwin2],                                                                                           
    
    ],                                                                                                                       
    
    @User[                                                                                                                       
    
    uid=@Long[10002],                                                                                                        
    
    nickName=@String[kerwin2---changeUser],                                                                              
    
    ],                                                                                                                   
    
    ]
      • 数组入参
  • [arthas@18904]$ ognl '@com.kerwin.arthas.demo.OgnlDemo03@setLists({"k1","k2","k3"})'                                     
    
    @ArrayList[                                                                                                                  
    
    @String[k1],                                                                                                             
    
    @String[k2],                                                                                                             
    
    @String[k3],                                                                                                         
    
    ]
      • Map入参
  • [arthas@18904]$ ognl '#map = #{"id":10003L,"nickName":"k3"},@com.kerwin.arthas.demo.OgnlDemo03@setMaps(#map)'            
    
    @LinkedHashMap[                                                                                                              
    
    @String[id]:@Long[10003],                                                                                                
    
    @String[nickName]:@String[k3],                                                                                       
    
    ]
  • 实践操作:使用ognl表达式获取Spring上下文中对象,并进行操作
    • 测试代码
  • @Service
    
    public class OgnlDemoService {
    
        private String description;
    
    
    
        public String getDescription() {
    
            return description;
    
        }
    
        public void setDescription(String description) {
    
            this.description = description;
    
        }
    
    }
    • 自定义一个获取Spring上下文中对象的工具类
  • @Component
    
    public class SpringApplicationContext implements ApplicationContextAware {
    
    
    
        private static ApplicationContext applicationContext;
    
    
    
        @Override
    
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    
            SpringApplicationContext.applicationContext = applicationContext;
    
        }
    
    
    
        /**
    
         * 通过class获取Bean
    
         */
    
        public static <T> T getBean(Class<T> clazz) {
    
            return applicationContext.getBean(clazz);
    
        }
    
        /**
    
         * 通过name获取 Bean.
    
         */
    
        public static Object getBean(String name) {
    
            return applicationContext.getBean(name);
    
        }
    
    }
    • 获取Spring上下文中的OgnlDemoService对象
  • # 通过beanName获取
    
    [arthas@30000]$ ognl '@com.example.test_mybatis.controller.SpringApplicationContext@getBean("ognlDemoService")'                      
    
    @OgnlDemoService[                                                                                                            
    
    description=null,                                                                                                    
    
    ]
    
    # 通过class获取                                                                                                                  
    
    [arthas@30000]$ ognl '#OgnlDemoServiceClass =@com.example.test_mybatis.service.OgnlDemoService@class,@com.kerwin.arthas.utils.Sp
    
    ringApplicationContext@getBean(#OgnlDemoServiceClass)'                                                                   
    
    @OgnlDemoService[                                                                                                            
    
    description=null,                                                                                                    
    
    ]
    • 操作OgnlDemoService对象中变量和方法
  • [arthas@30000]$ ognl '@com.example.test_mybatis.controller.SpringApplicationContext@getBean("ognlDemoService").description'          
    
    null                                                                                                                     
    
    [arthas@30000]$ ognl '@com.example.test_mybatis.controller.SpringApplicationContext@getBean("ognlDemoService").setDescription("HelloW orld")'                                                                                                                  
    
    null                                                                                                                     
    
    [arthas@30000]$ ognl '@com.example.test_mybatis.controller.SpringApplicationContext@getBean("ognlDemoService").getDescription()'     
    
    @String[Hello World]
  • trace
  • 使用 trace 命令可以跟踪统计方法耗时,经常用于排查运行较慢、耗时较长的场景
  • 测试代码
  • package com.example.test_mybatis.controller;
    
    
    
    import com.example.test_mybatis.service.UserServiceImpl;
    
    import lombok.extern.slf4j.Slf4j;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import org.springframework.web.bind.annotation.GetMapping;
    
    import org.springframework.web.bind.annotation.RestController;
    
    
    
    import java.util.HashMap;
    
    
    
    @RestController
    
    @Slf4j
    
    public class UserController {
    
    
    
        @Autowired
    
        private UserServiceImpl userService;
    
    
    
        @GetMapping(value = "/user")
    
        public HashMap<String, Object> getUser(Integer uid) throws Exception {
    
            // 模拟用户查询
    
            userService.get(uid);
    
            HashMap<String, Object> hashMap = new HashMap<>();
    
            hashMap.put("uid", uid);
    
            hashMap.put("name", "name" + uid);
    
            return hashMap;
    
        }
    
    }
    
    
    package com.example.test_mybatis.service;
    
    
    
    import lombok.extern.slf4j.Slf4j;
    
    import org.springframework.stereotype.Service;
    
    
    
    @Service
    
    @Slf4j
    
    public class UserServiceImpl {
    
    
    
        public void get(Integer uid) throws Exception {
    
            check(uid);
    
            service(uid);
    
            redis(uid);
    
            mysql(uid);
    
        }
    
    
    
        public void service(Integer uid) throws Exception {
    
            int count = 0;
    
            for (int i = 0; i < 10; i++) {
    
                count += i;
    
            }
    
            log.info("service  end {}", count);
    
        }
    
    
    
        public void redis(Integer uid) throws Exception {
    
            int count = 0;
    
            for (int i = 0; i < 10000; i++) {
    
                count += i;
    
            }
    
            log.info("redis  end {}", count);
    
        }
    
    
    
        public void mysql(Integer uid) throws Exception {
    
            long count = 0;
    
            for (int i = 0; i < 10000000; i++) {
    
                count += i;
    
            }
    
            log.info("mysql end {}", count);
    
        }
    
    
    
        public boolean check(Integer uid) throws Exception {
    
             if (uid == null || uid < 0) {
    
                 log.error("uid不正确,uid:{}", uid);
    
                 throw new Exception("uid不正确");
    
             }
    
             return true;
    
         }
    
    }
  • 在arthas中使用命令 trace com.example.test_mybatis.controller.UserController getUser

  • 继续跟踪耗时高的方法,然后再次访问。

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

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

相关文章

mqtt-emqx:paho.mqttv5的简单例子

# 安装emqx 请参考【https://blog.csdn.net/chenhz2284/article/details/139551293?spm1001.2014.3001.5502】 # 下面是示例代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</…

2024教资认定报名流程,点赞收藏!

2024年要进行教资认定的宝子们提早准备 &#x1f525;教资认定网上报名流程概览 一、进入教资认定网报入口 二、进行实名核验 三、申请网报时间查询 四、个人信息维护 五、认定申请报名 &#x1f525;教资认定所需材料 1⃣️身份证 2⃣️户口本&#xff0f;居住证&#xff0f;学…

算法导论实战(三)(算法导论习题第二十五、二十六章)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;算法启示录 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 第二十五章 25.1-10 25.2-5 25…

Liunx环境下redis主从集群搭建(保姆级教学)01

Linux 环境安装redis 准备一台linux虚拟机 我使用基于Linux的开源类服务器操作系统CentOS7。 打开虚拟机&#xff0c;输入密码登录 下载linux版本的redis安装包 已经下载redis-5.0.10.tar.gz 创建一个文件夹用来安装redis,我在/opt目录下创建redis文件夹 将下载好的redis…

Vue3 + TS + Antd + Pinia 从零搭建后台系统(一) 脚手架搭建 + 入口配置

简易后台系统搭建开启&#xff0c;分几篇文章更新&#xff0c;本篇主要先搭架子&#xff0c;配置入口文件等目录 效果图一、搭建脚手架&#xff1a;二、处理package.json基础需要的依赖及运行脚本三、创建环境运行文件四、填充vue.config.ts配置文件五、配置vite-env.d.ts使项目…

Vue3【十一】08使用toRefs和toRef

08使用toRefs和toRef toRefs()函数将person对象中的name和age属性转换为响应式引用&#xff0c;并返回一个对象&#xff0c;对象中的name和age属性都是响应式引用&#xff0c;具有响应式功能。 toRef()函数将person对象中的name属性转换为响应式引用&#xff0c;并返回一个响应…

每天五分钟深度学习pytorch:pytorch中的广播机制是什么?

本文重点 在pytorch中经常有张量和张量之间的运算,那么有一点需要注意,那就是维度要匹配,如果维度不匹配就有可能出现问题。如果维度不一致,此时也可以同时进行操作,此时就需要使用pytorch中的广播机制,本节课程就讲解pytorch中的广播机制。 广播机制示意图 如上就是py…

vue3+ts+vite项目开发--知识点梳理01

vue3tsvite项目开发--知识点梳理01 创建vue3项目01 tsconfig.node.json文件中extends报错02 知识点&#xff1a;用nvm安装最新版本的node03. template标签中的#表示啥意思04 ts中 &#xff1f;&#xff1f;使用05 ts中 reduce06 vue3ts中watch和watchEffect监听使用07 unocss用…

SwiftUI中Preference的理解与使用(ScrollView偏移量示例)

在 SwiftUI 中&#xff0c;Preference用于从视图层次结构的较深层次向上传递信息到较浅层次。这通常用于在父视图中获取子视图的属性或状态&#xff0c;而不需要使用状态管理工具如State或 ObservableObject。Preference特别用于自定义布局或组件&#xff0c;其中子视图需要向父…

构建智能汽车新质生产力丨美格智能亮相2024高通汽车技术与合作峰会

近日&#xff0c;以“我们一起&#xff0c;驭风前行”为主题的2024高通汽车技术与合作峰会在无锡国际会议中心隆重举行。作为高通公司的战略合作伙伴&#xff0c;美格智能受邀全程参与此次汽车技术与合作峰会。在峰会现场&#xff0c;美格智能产品团队隆重展示了多款基于高通平…

【Web API DOM07】事件委托

一&#xff1a;事件委托详解 1 什么是事件委托 利用事件流的特征&#xff08;事件冒泡&#xff09;&#xff0c;解决开发需求的知识技巧 2 事件委托好处 要真正执行任务的元素不注册事件&#xff0c;将对应的事件注册给祖先元素。减少事件的注册次数&#xff0c;提高程序运…

理解JVM内存模型与Java内存模型(JMM)

理解JVM内存模型与Java内存模型&#xff08;JMM&#xff09; 在Java程序的运行过程中&#xff0c;内存管理和线程的同步是两个重要的概念。本文将深入探讨JVM内存模型&#xff08;Java Virtual Machine Memory Model&#xff09;和JMM&#xff08;Java Memory Model&#xff0…

04 uboot 编译与调试

新手不需要详细掌握 uboot,只需要知道它是一个什么东西即可,工作中也只是改一些参数而已。 1、uboot 是什么 Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内…

【C语言】10.C语言指针(5)

文章目录 1.sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof 和 strlen的对⽐ 2.数组和指针笔试题解析2.1 ⼀维数组2.2 字符数组2.3 ⼆维数组 3.指针运算笔试题解析3.1 题⽬13.2 题⽬23.3 题⽬33.4 题⽬43.5 题⽬53.6 题⽬63.7 题⽬7 1.sizeof和strlen的对比 1.1 sizeof …

大模型,也在卷价格

“百模大战”已从算力战、规模战蔓延到了价格战。 5月15日&#xff0c;字节跳动宣布豆包主力模型&#xff08;小于等于32K&#xff09;在企业市场的定价只有0.0008元/千Tokens&#xff0c;0.8厘就能处理1500多个汉字&#xff0c;比行业便宜99.3%&#xff1b;5月21日&#xff0…

算法分析与设计期末考试复习(更新ing)

重点内容&#xff1a; 绪论&#xff1a; 简单的递推方程求解 1.19(1)(2) 、 教材例题 多个函数按照阶的大小排序 1.18 分治法&#xff1a; 分治法解决芯片测试问题 计算a^n的复杂度为logn的算法&#xff08;快速幂&#xff09; 分治法解决平面最近点对问…

hot100 -- 二分查找

目录 前言 &#x1f382;搜索插入位置 &#x1f33c;搜索二维矩阵 &#x1f33c;排序数组元素第一和最后一个位置 &#x1f33c;旋转排序数组 &#x1f4aa;旋转排序数组中的最小值 &#x1f4aa;两个正序数组的中位数 前言 二分算法学习_时间超限ac:0%-CSDN博客 &#…

【个人博客搭建】(22)申请QQ开发者

这里我们要引入的一个概念是OAuth - OAuth 2.0是一个行业标准的授权协议&#xff0c;用于处理用户数据访问和分享的安全问题。它允许用户将他们对某些服务的访问权限授权给第三方应用&#xff0c;而无需分享他们的用户名和密码。以下是对OAuth 2.0的介绍&#xff1a; 基本概念 …

Flutter中同步与异步

一&#xff0c;同步/异步的理解 1&#xff0c;await&#xff1a;同步机制 同步操作会阻止其他操作执行&#xff0c;直到完成为止。同步就好比打电话一样&#xff0c;打电话时都是一个人在说另一个人听&#xff0c;一个人在说的时候另一个人等待&#xff0c;等另一个人说完后再…

Python001

Python 是一种高级编程语言。它具有以下显著特点&#xff1a;1. 简单易学&#xff1a;语法相对简洁明了&#xff0c;对初学者很友好。2. 丰富的库&#xff1a;拥有大量强大的内置库和第三方库&#xff0c;可用于各种领域&#xff0c;如数据分析、机器学习、Web 开发等。3. 可读…