「Java」替换代码的情况下不停机!这操作可能工作6年的Java程序员都不会( 二 )

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug , 难道只能通过加日志再重新发布吗?
  • 【「Java」替换代码的情况下不停机!这操作可能工作6年的Java程序员都不会】线上遇到某个用户的数据处理有问题 , 但线上同样无法 debug , 线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
  • 线上代码有错误 , 不想重新发布?那能不能改class文件替换一下?
  • Arthas两种安装、启动方式1、jar包启动
    首先想用arthas调试项目 , 服务器必须要有运行着的Java服务 , demo-0.0.1-SNAPSHOT.jar就是我启动的测试项目 , 启动arthas后它会自动检测本地所有的Java服务列出来 , 我们只需按照序号输入想要调试的项目即可 , 选1进入对应进程的arthas交互平台
    2、在线安装
    执行上面的命令会在所在的文件中生成as.sh执行文件
    启动arthas
    3、远程连接:「要想使用arthas服务的 web console必须对外暴露本机ip」
    访问arthas控制台也有两种方法
    「(1)、web console 界面」
    「重点说明」:--target-ip 的ip 一定要是arthas所在机器对外暴露的ip , 「但如果用的是阿里云机器必须要使用私有ip启动arthas服务 , 但访问必须是公网IP」
    「(2)、telnet方式」
    telnet 10.0.2.5 8563

    访问 http://59.110.218.9:8563/, 进入交互平台
    Arthas 命令使用1、Dashboard 命令查看当前系统的实时数据面板 , 例如:服务器thread信息、内存memory、GC回收等情况
    2、Thread(线程监控)
    「可以看到这个线程是被synchroned关键字锁导致的阻塞」  , 目前只支持找出synchronized关键字阻塞住的线程 ,如果是java.util.concurrent.Lock ,目前还不支持 。
    「重点学习」:thread -b ##「找出当前阻塞其他线程的线程」
    3、JVM (jvm实时运行状态 , 内存使用情况等)
    4、trace (当前方法内部调用路径 , 路径上每个节点的耗时)$ trace #类名  #方法名 

    对于执行耗时相对较长的方法 , 调用链路耗时属性会高亮显示方便排查
    参数 -j 可以过滤jdk的函数 trace -j
    com.example.demo.controller index2 参数 #cost 可以按执行耗时毫秒ms过滤 trace -j
    com.example.demo.controller index2 ’#cost >10‘
    5、watch当前方法执行数据观测 , 能观察到的范围为:返回值、抛出异常、入参
    throwExp:异常 params :入参(数组) , 单个参数params【0】 returnObj:返回值
    6、stack当前方法被调用的路径 , 显示当前方法被那些方法调用
    7、monitor 命令监控类、方法的调用进行监控 , 调用次数、成功次数、失败次数、平均响应时长、失败率等
       8、classloader 命令将JVM中所有的类加载器统计出来 , 树状展示
    线上代码热更新(动态修改上线项目代码)手动在代码中抛异常 , 「不停机不重新发包的情况下 , 修改线上代码」
    启动服务也达到我们预期异常
    「替换代码的流程:」
    1、jad命令 将需要更改的文件先进行反编译 , 保存下来, 编译器修改
    在这里插入图片描述
    修改完以后需要将类重新加载到JVM
    2、SC命令 查找当前类是哪个classLoader加载的
        3、MC命令 用指定的classloader重新将类在内存中编译


    推荐阅读