Arthas(阿尔萨斯)是 Alibaba 开源的一款 Java 诊断工具,使用它我们可以监控和排查 Java 程序,然而它还提供了非常实用的 Java 热更新功能。

所谓的 Java 热更新是指在不重启项目的情况下实现代码的更新与替换。使用它可以实现不停机更新 Java 程序,尤其是对那些启动非常耗时的 Java 项目来说,更是效果显著。

Arthas 的使用其实非常简单,它为我们提供了一个 Jar 包,我们只需要把这个 Jar 下载到本地,然后运行这个 Jar 包就可以正常使用它的功能了。

Arthas 功能简述

当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决(来自官方):这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

是否有一个全局视角来查看系统的运行状况?

有什么办法可以监控到JVM的实时运行状态?

怎么快速定位应用的热点,生成火焰图?

Arthas 支持 JDK 6+,支持 Linux/Mac/Winodws,它采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

Arthas 使用

Arthas 的使用步骤如下。

步骤一:下载 Arthas

首先,我们先把 Arthas 的 Jar 包下载到本地,它的下载地址是:https://alibaba.github.io/arthas/arthas-boot.jar

步骤二:启动 Arthas

我们只需要使用普通的 jar 包启动命令:java -jar arthas-boot.jar 来启动 Arthas 即可,启动成功之后的运行界面如下:

如上图所示则表示 Arthas 启动成功。小贴士:当我们运行 java -jar arthas-boot.jar 命令时,首先需要先切换目录至该 jar 包的位置,才能正常的启动 Arthas。

步骤三:运行 Arthas

当我们启动完 Arthas 之后,根据上图的提示,我们需要选择一个要调试的 Java 进程,例如我们输入“4”来监测我自己写的一个 Java 测试程序,执行结果如下:

当出现 Arthas 的 logo 之后,表示 Arthas 正常加载了 Java 进程。

步骤四:操作 Arthas

当 Arthas 加载 Java 进程成功之后,我们就可以输入相关的命令来查看相关的信息了。

假如我们把本地环境视为生产服务器,我们此时需要查看某个运行的 Java 程序是否为最新版的。

在没有 Arthas 之前,我们通常的步骤是这样的:找到相应的 jar 包(或者 war 包);

将 jar 包(或者 war 包)下载到本地;

找出相应的类进行解压操作;

然后将解压的 class 文件拖拽到 Java 编译器(Idea 或 Eclipse)中,查看是否为最新的代码。

但如果使用的是 Arthas,那么我们就可以直接通过反编译命令,将字节码编译为正常的 Java 代码,然后再确认是否为最新的代码即可。我们只需要执行jad 命令即可,实现示例如下:

这样我们就可以直接来查看这个发布的程序是否为最新版本了。

不仅如此,我们还可以使用 Arthas 来监测整个程序的运行情况,如下图所示:

我们还可以用 Arthas 来查看一些 JVM 的相关信息,如下图所示:

更多 Arthas 的功能,请访问:https://alibaba.github.io/arthas/commands.html

热更新 Java 代码

假如我们原来的代码是这样的:package com.example;

import java.util.concurrent.TimeUnit;

public class App {

public static void main(String[] args) throws InterruptedException {

while (true) { // 每两秒钟打印一条信息

TimeUnit.SECONDS.sleep(3);

sayHi();

}

}

private static void sayHi() {

// 需要修改的标识

boolean flag = true;

if (flag) {

System.out.println("Hello,Java.");

} else {

System.out.println("Hello,Java中文社群.");

}

}

}

我们现在想要把flag 变量改为 false 就可以这样来做:使用 Arthas 的内存编译工具将新的 Java 代码编译为字节码;

使用 Arthas 的 redefine 命令实现热更新。

1.编译字节码

首先,我们需要将新的 Java 代码编译为字节码,我们可以通过 Arthas 提供的mc 命令实现,mc 是 Memory Compiler(内存编译器)的缩写。

实现示例如下:[arthas@3478]$ mc /Users/admin/Desktop/App.java -d /Users/admin/Desktop

Memory compiler output:

/Users/admin/Desktop/com/example/App.class

Affect(row-cnt:1) cost in 390 ms.

其中-d 表示编译文件的存放位置。小贴士:我们也可以使用 javac App.java 生成的字节码,它与此步骤执行的结果相同。

2.执行热更新

有了字节码文件之后,我们就可以使用redefine 命令来实现热更新了,实现示例如下:[arthas@51787]$ redefine /Users/admin/Desktop/com/example/App.class

redefine success, size: 1

从上述结果可以看出,热更新执行成功,此时我们去控制台查看执行结果,如下图所示:

这说明热更新执行确实成功了。

Arthas 热更新注意事项

使用热更新功能有一些条件限制,我们只能用它来修改方法内部的一些业务代码,如果我们出现了以下任意一种情况,那么热更新就会执行失败:增加类属性(类字段);

增加或删除方法;

替换正在运行的方法。

最后一条我们需要单独说明一下,假如我们把上面的示例改为如下代码:package com.example;

import java.util.concurrent.TimeUnit;

public class App {

public static void main(String[] args) throws InterruptedException {

while (true) { // 每两秒钟打印一条信息

TimeUnit.SECONDS.sleep(3);

boolean flag = true;

if (flag) {

System.out.println("Hello,Java.");

} else {

System.out.println("Hello,Java中文社群.");

}

}

}

}

那么此时我们再进行热更新操作修改flag 的值,那么就会执行失败,因为我们替换的是正在运行中的方法,而我们正常示例中的代码之所以能成功,是因为我们在 while 无线循环中调用了另一个方法,而那个方法是被间歇性使用的,因此可以替换成功。

总结

本文我们讲了 Arthas 的概念以及具体的使用流程,Arthas 其实就是一个普通的 Java 程序,我们可以使用java -jar arthas-boot.jar 来启动它,然后再选择我们要操作的 Java 进程,这样就可以实现状态监控和其他操作。

文章的后半部分,我们介绍了 Arthas 的热更新功能,而热更新本质上只需要使用一个redefine 命令来加载新的字节码文件就可以实现热更新了,但需要注意热更新不能替换正在运行的方法,它只能修改方法内部的业务代码,如果修改了类字段或者是更改了类方法,那么热更新就会执行失败。

java 极客漫画_漫画:Java如何实现热更新?相关推荐

  1. java 极客_Java极客思维

    ​ 开篇介绍 大家好,公众号[Java极客思维]近期会整理一些Java高频面试题分享给小伙伴,也希望看到的小伙伴在找工作过程中能够用得到!本章节主要针对Java一些消息中间件高频面试题进行分享. 通知 ...

  2. 我与微笑哥以及 Java 极客技术的前世今生

    Hello,大家好,我是子悠,Java 极客技术团队的作者之一,本周是六月的第三周,将由我给大家编辑<Java 极客技术>的相关文章,希望大家喜欢. 每个周一都是让人很不开心的一天,因为这 ...

  3. 今天,正式介绍一下Java极客技术知识星球

    前面煽情的文字就不放了,还是那句  别让高手和你距离越来越远,其实你也是高手! 从创建知识星球到现在已经过去一个月的时间了,在这里正式介绍一下 Java极客技术知识星球 星球规划: 一.每周分享一个面 ...

  4. 【极客时间】《Java并发编程实战》学习笔记

    目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...

  5. 极客时间和极客学院_极客奔跑

    极客时间和极客学院 I'm not a natural runner. I'm reasonably fit given that I spend most of the day sat in my ...

  6. 极客时间和极客学院_极客在海滩

    极客时间和极客学院 As reported by Jeremy, Andy and Jon, last weekend was a chance for that rare creature – th ...

  7. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  8. 极客时间_软件设计之美 笔记

    极客时间_软件设计之美 笔记 1.软件设计是什么 写代码前应该有模型设计 比如mvc结构就是一种模型 代码应该有规范, 产品内部原则 避免每个开发按自己的想法实现,有人写rest 有人写mvc 代码模 ...

  9. 极客新闻——10、Java工程师应该如何成长?

    本文笔记全部来自<极客新闻>--新鲜的技术资讯.权威的趋势剖析.别样的技术洞察 不少开发者会抱怨"面试造火箭,天天拧螺丝",每天进行重复业务开发,似乎能力被日常工作限制 ...

最新文章

  1. IntelliJ IDEA 2018.1新特性
  2. 高级计算机网络知识点复习
  3. Android数据存储
  4. android唤醒前台,Android将后台应用唤起到前台的方法 (SDK 4.0, ActivityLifecycleCallbacks)...
  5. 微信终端跨平台组件 mars 系列(二) - 信令传输超时设计
  6. 记:第一次更新服务器CUDA和GPU驱动
  7. java(8)——和、|和||、!、^及三目运算符
  8. 【算法设计与分析】08 序列求和的方法
  9. container_of宏
  10. HTML+CSS+JS实现canvas仿ps橡皮擦刮卡效果
  11. 技术实践丨基于MindSpore框架Yolov3-darknet模型的篮球动作检测体验
  12. spring中context:property-placeholder/元素
  13. 中望CAD的引线标注格式怎么改_大神总结的CAD设计五个段位 快来看看你在哪个阶段...
  14. vscode安卓html扩展,vscode扩展信息.html
  15. linux mysql优化_Linux上跑MySQL优化技巧
  16. 【计算机网络自顶向下方法】深入理解计算机网络分层和封装模型
  17. 手绘风海报怎么做?手绘素材在哪里找?
  18. MaskNet 这个CTR模型,有点意思
  19. Altas 200 DK环境配置
  20. AVR单片机网址推荐 .

热门文章

  1. Luogu5234[JSOI2012]越狱老虎桥
  2. 如何将Excel文件转换WPS格式?
  3. 嫁给年薪百万的程序员,结婚 6 年后的我竟然还是处女
  4. Cannot create symlink/symbolic to `xxx': Operation not supported
  5. 语句摘抄——第16周
  6. 关于 CVE-2021-44228 Log4j2 漏洞的相关应对汇总说明(包含中英文客户公告)
  7. 文墨绘学怨气里长大的孩子
  8. 二十九幅图片所展现的意境:壮美!
  9. greenplum官方监控工具 GPCC 安装、升级、卸载
  10. 知识产权保护的内容有哪些?