使用arthas命令redefine实现Java热更新(推荐)

arthas 是一个 Java 开源诊断神器。

今天分享一个非常重要的命令 redefine ,主要作用是加载外部的 .class 文件,用来替换 JVM 已经加载的类,总结起来就是实现了 Java 的热更新。

redefine 在一下几种情况中会失败:1、增加了 field ;2、增加了 method ;3、替换正在运行的方法。

前两个比较好理解,第三个意思就是这个方法必须结束之后才会被替换,如果有个方法开始运行之后就不会跳出,那么这个方法所在的类是无法被替换的,类似无限循环的方法。

中间提到了将本地的 .class 文件上传到服务器的技巧,个人没有采用,如果是要热更新,完全可以利用 mc 这个命令在服务端编译更新后的代码,然后进行本地替换。

arthas命令redefine实现Java热更新

代码

package com.fun;

import com.fun.frame.SourceCode;
import org.slf4j.Logger;

import java.util.ArrayList;
import java.util.List;
public class Fun extends SourceCode {
  int[] ss = new int[1024];
  public static Logger logger = getLogger(Fun.class);
  public static void main(String[] args) {
    List<Fun> funs = new ArrayList<>();
    while (true) {
      Fun fun = new Fun();
      funs.add(fun);
      sleep(3000);
      test();
      output(funs.size());
    }
  }
  public static void test() {
    logger.info("成功!!!");
  }
}

调用 test() 方法会打印日志的,如果是该方法被其他地方调用,修改之后也会生效。

到此这篇关于使用arthas命令redefine实现Java热更新(推荐)的文章就介绍到这了,更多相关arthas Java热更新内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解如何热更新线上的Java服务器代码

    一.前言 1.热更新代码的场景 (1)当线上服务器出现问题时,有些时候现有的手段不足以发现问题所在,可能需要追加打印日志或者增加一些调试代码,如果我们去改代码重新部署,会破坏问题现场,可以通过热部署的手段来增加调试代码 (2)线上出现紧急bug,通过Review代码找到问题,修改好后打包部署的流程可能比较久,可以通过热部署代码及时解决问题 二.Arthas的使用 使用阿里巴巴开源的Java诊断工具---Arthas,他可以附着在我们的Java服务器进程上面,查看服务器状态,jvm状态等各种参数指

  • Java动态追踪技术探究之从JSP到Arthas

    从JSP说起 对于大多数Java程序员来说,早期的时候,都会接触到一个叫做JSP(Java Server Pages)的技术.虽然这种技术,在前后端代码分离.前后端逻辑分离.前后端组织架构分离的今天来看,已经过时了,但是其中还是有一些有意思的东西,值得拿出来说一说. 当时刚刚处于Java入门时期的我们,大多数精力似乎都放在了JSP的页面展示效果上了: "这个表格显示的行数不对" "原来是for循环写的有问题,改一下,刷新页面再试一遍" "嗯,好了,表格显示

  • 使用arthas命令redefine实现Java热更新(推荐)

    arthas 是一个 Java 开源诊断神器. 今天分享一个非常重要的命令 redefine ,主要作用是加载外部的 .class 文件,用来替换 JVM 已经加载的类,总结起来就是实现了 Java 的热更新. redefine 在一下几种情况中会失败:1.增加了 field :2.增加了 method :3.替换正在运行的方法. 前两个比较好理解,第三个意思就是这个方法必须结束之后才会被替换,如果有个方法开始运行之后就不会跳出,那么这个方法所在的类是无法被替换的,类似无限循环的方法. 中间提到

  • Java 热更新 Groovy 实践及踩坑指南(推荐)

    目录 Groovy 是什么? Java 为何需要 Groovy ? 热部署技术设计及实现 使用场景 风控安全——规则引擎 监控中心 活动营销 技术实现 脚本加载/更新 脚本执行 生产踩坑指南 Java8 lambda 与 Groovy 语法问题 GroovyClassLoader 加载机制导致频繁gc问题 脚本首次执行耗时高 Groovy 是什么? Apache的Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似Python.Ruby和Smalltalk中的一些特性,可以作

  • Android热更新开源项目Tinker集成实践总结

    前言 最近项目集成了Tinker,开始认为集成会比较简单,但是在实际操作的过程中还是遇到了一些问题,本文就会介绍在集成过程大家基本会遇到的主要问题. 考虑一:后台的选取 目前后台功能可以通过三种方式实现: 1.自己搭建后台布丁下发系统 2.第三方提供的服务,目前如原微信simsun大神的个人tinkerpatch平台,目前出于内测阶段,暂时免费.后期应该会按下发量对app进行收费. 3.腾讯Bugly提供的服务,提供了热更新的下发后台,集成到了bugly的升级sdk中.免费. 根据公司的精神,我

  • React Native 实现热更新并自动签名打包功能

    项目背景:手动link的安卓App 1.下载 react-native-code-push npm install --save react-native-code-push 2.在android/settings.gradle文件下新增: include ':app', ':react-native-code-push' project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../no

  • lambda 表达式导致 Arthas 无法 redefine 的问题

    作为一个从 PHP 转 Java 的人,发现 alibaba 的 arthas 很好用.通过 arthas 的 redefine 命令,可以像 PHP 一样,不用重新发布,就可以改变程序行为. 但是用多了,发现很多时候,我们就改了几行代码,甚至有的时候就添加了一行日志,就无法 redefine 了.提示: redefine error! java.lang.UnsupportedOperationException: class redefinition failed: attempted to

  • 搭建React Native热更新平台的详细过程

    目录 一,什么是热更新 二,热更新方案 三,热更新原理 四,CDN 热更新方案 五,纯 CDN 方案的弊端 六,线上方案 七.整体方案梳理 八,总结 一,什么是热更新 所谓热更新,也叫做动态更新,一种类似 Web 的更新方式.相对于 App 的发版更新而言,热更新能及时的修复线上存在的问题,大幅的提升业务迭代效率.我们都知道,互联网业务讲究兵贵神速,如果业务能够通过热更新来快速发版和迭代,这就相当于在产品和用户之间搭建了一座能够随时通行的桥梁,代替了原来好几周才能有一次迭代的问题. 那么,热更新

  • webpack实现热更新(实施同步刷新)

    本文介绍了webpack实现热更新(实施同步刷新),分享给大家,希望对大家有帮助. 解决方案一: 实现热更新,首先,安装一系列的node命令,如果嫌麻烦,你可以直接看解决方案二,相对来说比较简单. 1.webpack命令安装 npm install webpack -g npm init npm init -yes //可以创建默认的package.json npm install webpack --save-dev npm install path fs html-webpack-plugi

  • 微信Android热更新Tinker使用详解(星空武哥)

    Tinker是什么 Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码.So库以及资源,让应用能够在不需要重新安装的情况下实现更新.当然,你也可以使用Tinker来更新你的插件. 它主要包括以下几个部分: gradle编译插件: tinker-patch-gradle-plugin 核心sdk库: tinker-android-lib 非gradle编译用户的命令行版本: tinker-patch-cli.jar 为什么使用Tinker 当前市面的热补丁方案有很多,其中比较

  • 详解Android中实现热更新的原理

    这篇文章就来介绍一下Android中实现热更新的原理. 一.ClassLoader 我们知道Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLoader类作为Android的默认的类加载器,PathClassLoader其实实现的就是简单的从文件系统中加载类文件.PathClassLoade本身继承自BaseDexClassLoader,BaseDexClassLoader重写了findClass方法

  • Android微信Tinker热更新详细使用

    先看一下效果图 Tinker已知问题 由于原理与系统限制,Tinker有以下已知问题: Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件: 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码: 在Android N上,补丁对应用启动时间有轻微的影响: 不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed": 由于各个厂商的

随机推荐