idea 项目jar反编译java_带你上手阿里开源的 Java 诊断利器:Arthas

765097e43ad4f0477ee2fbc501aa8285.png
本文适合有 Java 基础知识的人群。

本文作者:HelloGitHub-秦人

HelloGitHub 推出的《讲解开源项目》系列,今天给大家带来一款阿里开源的 Java 诊断利器 Arthas 项目—— Arthas

项目源码地址:https://github.com/alibaba/arthas

一、简介

为什么要用 Arthas?好多 Java 开发的小伙伴可能有遇到下面这些问题:

  • 项目中导入了一个 jar 包的不同版本,那么这个类从哪个 jar 包加载的?线上环境为什么会报各种异常?
  • 本地项目运行没问题,线上环境运行的结果为什么和本地不同?数据原因没有执行到?代码没有 commit?环境上使用的分支搞不对?
  • 线上环境遇到偶先问题,难道只能通过加日志,调整项目日志级别,重新打包发布验证问题吗?
  • 线上环境遇到某个用户的审批流程走的不对,线下环境无法重现,怎么在线上进行远程调试呢?
  • 有没有一个监控系统的运行整体状况的功能?
  • JDK 自带了一些监控工具,本地可动态监控 JVM 运行状态,那么线上环境有什么办法可以监控到 JVM 的实时运行状态?
  • 在线上环境怎么快速定位应用的热点,生成火焰图?

1.1 实现原理

整体宏观模块调用图如下:

07ce21c61baf57ab76f501da603817aa.png

1.2 主要功能

Arthas 提供的功能主要可以分为以下三个方面:

1 . 信息监控

    • 进程运行基本信息包括:内存、CPU占用、线程信息、线程堆栈、线程数统计、环境变量信息。
    • 对象信息:类对象静态属性、 Mbean 的属性信息、已加载类信息、类加载器、类方法信息。

2 . 方法调用

    • 方法调用入参、返回值查看。
    • 方法被调用的调用路径、调用耗时、方法调用次数、成功次数、失败次数等统计。
    • 记录和重做方法调用。

3 . 类文件处理

    • dump 已加载类的字节码、字节码反编译、类编译、类重新热加载。

二、安装和使用

2.1 Linux 环境使用

登录 Linux 环境,下载 arthas-boot.jar,然后使用命令 java -jar xxx.jar 直接运行 jar 包。

下面两个命令效果一样,都可以下载。

curl -O https://alibaba.github.io/arthas/arthas-boot.jar
wget https://alibaba.github.io/arthas/arthas-boot.jar

进入 Arthas 第一步需要选择项目

d832564d2ba3f0fe4a7111677e4261b9.png

2.2 Docker 环境使用

进入一个之前已经启动的 Docker 容器,这里我进入了 tomcat7 容器。

docker ps -a #查看所有容器
docker cp arthas-boot.jar tomcat7:/home #拷贝 jar 到容器 home 目录
docker exec -it tomcat7 bash #进入名称叫 tomcat7 的容器
cd /home 
java -jar arthas-boot.jar #运行 jar 包

注意:选择的 Docker 容器必须是以 JDK 为基础依赖构建的。

在命令行输入 dashboard 就可以进入仪表板的所有数据。

ac3ba74669a19c48ce5000fe4afde03d.png

2.3 在开发工具 IntelliJ IDEA 使用

Cloud Toolkit 是一个 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。方便地将本地应用一键部署到任意机器,或 ECS、EDAS、Kubernetes。这里只介绍一下连接远程服务器,使用 Arthas。

2.3.1 安装插件

File->Settings->Plugins 搜索 Alibaba Cloud Toolkit

ef1efe5af72a9dd97115b605b9d46cea.png

插件安装完重启 IDEA。

2.3.2 使用工具

添加远程服务器,如下图操作:

f331ca62902ca132068c5dc99e3b93d8.png

服务器配置成功后,选择 More->Diagnostic 即可连接到服务器上。

869f8eb4b24f672f62a95029f5599c8d.png

2.3.3 运行效果

6f127f5331cd7b1b48b384536b00d3db.png

三、实战案例分析

以线上代码热更新,这里我写了一个小的 Sprinboot 项目,主要就是一个获取学习信息的接口。

@RestController
public class StudentConroller {@GetMapping("getUserInfo")public Student getUserInfo() {return new Student("小刘",12,"西安市雁塔区");}
}

通过 curl http://localhost:9000/getUserInfo,访问内容如下:

{"name":"小刘","id":12,"address":"西安市雁塔区"}

在服务运行要测试的项目 demo-0.0.1-SNAPSHOT.jar

nohup java -jar demo-0.0.1-SNAPSHOT.jar & #后台运行
curl http://localhost:9000/getUserInfo #访问接口

运行 Arthas 主程序 arthas-boot.jar,选择进入demo-0.0.1-SNAPSHOT.jar

093c6bfec101e4e12dfe8d66ff3d48a2.png

使用 jad 反编译 StudentConroller.java 代码

jad --source-only com.example.demo.controller.StudentConroller > /tmp/StudentConroller.java

打开 /tmp/StudentConroller.java 下的文件,修改反编绎出来的代码,修改内容如下:

@RestController
public class StudentConroller {@GetMapping(value={"getUserInfo"})public Student getUserInfo() {return new Student("小刘1", 122, "西安市高新区");}
}
  • sc 命令查找加载 StudentConroller 的 ClassLoader
    $ sc -d *StudentConroller | grep classLoaderHash
    classLoaderHash 2e0fa5d3
  • mc 命令内存编绎代码
    $ mc -c 2e0fa5d3 /tmp/StudentConroller.java -d /tmp
    Memory compiler output:/tmp/com/example/demo/arthas/user/controller/StudentConroller.class
    Affect(row-cnt:1) cost in 346 ms
  • redefine 命令热更新代码
    $ redefine /tmp/com/example/demo/controller/StudentConroller.class
    redefine success, size: 1
  • 检测热更新结果 再次访问 curl http://localhost:9000/getUserInfo,显示如下内容:

5f62300c388f7c751c4aa2c1ca698f0b.png

用 Arthas 的 jad/mc/redefine 一条龙命令来线上热更新代码非常强大,但也很危险,要做好权限管理哦。

四、总结

本文开头讲 Arthas 有什么作用、我们为什么要用它。接着讲了三种场景是如何使用 Arthas。最后以 Java 代码在线热部署为例,感受了 Arthas 的强大。看到这里我想你也对 Arthas 工具有了一个简单的认识。

现在的趋势开发人员做了久了慢慢就变为 DevOps,了解更多的底层逻辑也能更好的反馈到代码层面的上层建筑

本文只能带大家入门,Arthas 还有更多强大的功能等待你的发现!

五、附录

  • Arthas 官方文档
  • Arthas 脑图—常用命令汇总

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

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

相关文章

22Java之JDBCTemplate总结

写在前面:这里总结4种方式来操作数据库(SE阶段) 一、JDBC JDBC有关的类:都在java.sql 和 javax.sql 包下.1.数据准备 这里假设已经在数据库中新建立了mydb4数据库,并且也插入了一些数据,并且还需要导入一个…

福布斯评科技未来五大趋势:电脑消失融入生活时间

福布斯评科技未来五大趋势:电脑消失融入生活时间 谈趋势似乎并不讨巧,因为所谓趋势通常都是指时尚。每每谈及趋势,人们立刻就会想到穿着夸张服饰在T台上昂首阔步的模特,但每当下一季的新款推出,再华丽的时装都会很快…

Windows如何开启虚拟化,以安装虚拟机?

参考:Windows如何开启虚拟化,以安装虚拟机? 作者:一只青木呀 发布时间:2020-08-28 20:58:45 网址:https://blog.csdn.net/weixin_45309916/article/details/108286787 设置BIOS 安装 Ubuntu 时报错&#x…

php生成文件index.html,Typecho生成静态首页index.html文件

Typecho生成静态首页index.html文件作者:佚名来源:爱好者时间:2019-11-02在挨踢路看到的教程,不仅仅适用于Typecho,wordpress也是可以通用。教程在网站根目录新建文件f5.php然后里面写入下面的代码。$nowtimetime();$p…

python语言1002python语言_PYTHON语言学习

PYTHON 语言学习 通过两个星期的自学 python 语言,初步了解到 python 的知识构架。它比 C 语言和 C 语 言在某种程度上来说要简单些, 但是也有很多我不懂的东西。 陈老师给我安排的课堂任务是 第 21 章的 Database Programming ,通过 python …

python数据结构之栈

栈栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据&a…

Ubuntu 16.04安装教程及虚拟机设置

摘自:Ubuntu 16.04安装教程及设置 作者:一只青木呀 发布时间: 2020-07-09 22:36:50 网址:https://blog.csdn.net/weixin_45309916/article/details/107239119 配合这篇博文:安装ubuntu20.04并进行优化——安装vim,gcc,…

matlab vision工具箱使用手册,matlab-Computer Vision System ToolBox的系统对象使用

在MATLAB中,调用计算机视觉工具箱中的vision.GeometricScaler可实现对输入图像的缩放变换。 vision.GeometricScaler的具体使用方法如下: vision.GeometricScaler 功能:对图像进行几何尺寸的放缩; 语法:A step(vision…

python方法名加__学习python中__name__方法使用

今天在自学生产者消费者模型时,发现了一个有趣的方法 if__name__ "__main__": for i in range(2): p Producer() p.start() for i in range(10): c Consumer() c.start() 于是就去确认了一下度娘,果然好多初学者都会问这个问题,…

牛客小白月赛6 J 洋灰三角

J 洋灰三角 题目: 链接:https://www.nowcoder.com/acm/contest/136/J来源:牛客网 时间限制:C/C 1秒,其他语言2秒空间限制:C/C 262144K,其他语言524288K64bit IO Format: %lld题目描述 洋灰是…

PureMVC(AS3)剖析:设计模式(二)

PureMVC(AS3)剖析:设计模式(二) 模式 上一篇中介绍了PureMVC中使用的3种设计模式:单例模式、观察者模式、外观模式。本篇将继续介绍剩下的3种设计模式: l 使用中介者(Mediator&…

FileZilla的下载与安装以及简单使用(Ubuntu和Windows之间互传文件需要下载——客户端)

参考:FileZilla的下载与安装以及简单使用(有图解超简单) 作者:一只青木呀 发布时间: 2020-08-04 13:20:59 网址:https://blog.csdn.net/weixin_45309916/article/details/107782070?ops_request_misc%257B…

基于Matlab的循环码实验报告,基于MATLAB的循环码实验报告

及g(x)|C(x)上述定理告诉了构造(n,k)循环码的方法如下: ① 对xn-1 (在二元域中等效于对xn1)实行因式分解, 找出其中的(n-k)次因式。② 以找出的(n-k)次因式为循环码生成多项式g(x),与信息多项式m(x)相乘,即得码多项式:…

前后端交互中,返回前端的自定义响应数据结构

在前后端交互分离的体系下,我们后端一般会将返回给前端的信息数据进行格式的统一,然后返回前端json串;,一下我提供了一个模板,在实际开发中可进行参考 package com.project.util;/** * Description: 自定义响应数据结构…

如何解决Filezilla 与虚拟机连接不上的问题

摘自:如何解决Filezilla 与虚拟机连接不上的问题 作者:一只青木呀 发布时间: 2020-08-28 21:48:04 网址:https://blog.csdn.net/weixin_45309916/article/details/108287326?ops_request_misc%257B%2522request%255Fid%2522%253A…

php 访问 sharepoint列表,SharePoint—用REST方式访问列表

REST的定义与作用在SharePoint 2010中,基本上有如下几种数据访问方式: 服务器端对象模型LINQ to SharePointWeb Service客户端对象模型ADO.NET Data Service (REST协议)ADO.NET Data Service (强类型)REST是SharePoint中一种数据访问方式,这种…

python去除特殊字符_python去除BOM头\ufeff等特殊字符

1.\ufeff 字节顺序标记 去掉\ufeff,只需改一下编码就行,把UTF-8编码改成UTF-8-sig with open(file_path, moder, encodingUTF-8-sig) as f: s f.read() 2.\xa0 是不间断空白符 \xa0 是不间断空白符 我们通常所用的空格是 \x20 ,是在标准AS…

Vmware虚拟机三种网络模式配图详解

目录Vmware虚拟机三种网络模式详解Vmware虚拟机三种网络模式详解 具体的文字描述参见博文:https://www.cnblogs.com/linjiaxin/p/6476480.html Linux——Vmware虚拟机三种网络模式详解

SQL SERVER 中identity

SQL SERVER 中identity用法: 在数据库中, 常用的一个流水编号通常会使用 identity 栏位来进行设置, 这种编号的好处是一定不会重覆, 而且一定是唯一的, 这对table中的唯一值特性很重要, 通常用来做客户编号, 订单编号等功能, 以下介绍关于此种栏位常用方式及相关技…

php content-type: multipart/mixed,{error:invalid multipart format} 这是什么原因,我已经在HEADER中设置了Content-...

用CULR向七牛的API上传文件每次总是invalid multipart format但是我已经设置了Content-type:multipart/form-data呀function uploadFile($localPath, $remoteFileName, $headersarray()){global $conf;$remoteFileName trim($remoteFileName,/);$policy array(scope > $co…