游戏上线后难免会有功能性bug,这些bug很多只做一些小的改动即可修复。设想假如每次有bug修复之后,都要重启服务器,势必会导致部分玩家流失,对游戏产生不好的影响。在这个背景下,代码热更新还是很有必要的。这里,我们来讨论一种java代码热更新的实现。

代码热更-开源工具的实现

1.Apache Tomcat 实现:

Tomcat 动态 JSP 编译运行,这是一种阉割的热加载。Tomcat 采用ecj (eclise-jdt)组件动态编译jsp生成servlet类,servlet是有固定模板。相对于只改变方法,使用自定义JspLoader 重新创建一个实例的方式运行。普通类和Servlet 本身不行,如修改需要触发context reload (自动重启)

2.Eclipse实现

Eclipse 调试模式下的代码热更,由IDE 内部实现,实际使用的是java agent技术。

代码热更-javaAgent实现

JavaAgent 是JDK 1.5 以后引入的。java.lang.instrument

Agent技术,解决以下两个问题:

1. Java程序启动之前修改类,即main()方法执行前

通过指令java -javaagent:[=] 触发以下接口

public static void premain(String agentArgs, Instrumentation inst)

2. Java程序运行时修改类

通过新启一个程序获取目标

VirtualMachine virtualmachine = VirtualMachine.attach(jvm_pid);

virtualmachine.loadAgent(agentJarPath, agentParam); 触发下面接口

public static void agentmain (String agentArgs, Instrumentation inst)

作为agent jar 文件需要定义 MANIFEST.MF 属性

Manifest-Version: 1.0

Agent-Class: com.cyou.xyj.agent.ReloadAccountAgent

Premain-Class: com.cyou.xyj.agent.ReloadAccountAgent

Can-Redine-Classes: true

Can-Retransform-Classes: true

Instrumentation 类

void addTransformer(ClassFileTransformer transformer, boolean canRetransform)

boolean removeTransformer(ClassFileTransformer transformer)

void redefineClasses(ClassDefinition... definitions) // 重定义类

boolean isModifiableClass (Class> theClass);

void appendToBootstrapClassLoaderSearch(JarFile jarfile)

// 应用。运行时远程加载类库,核心类库不公开

// 运行时扩展功能 etc..

ClassFileTransformer 类,唯一接口

// loader 类加载器

// classBeingRedefined 是否允许重定义

// classfileBuffer 原类的字节码

byte[]transform(ClassLoader loader,String className,Class> classBeingRedefined,ProtectionDomain protectionDomain,byte[] classfileBuffer)

类转化的实际逻辑就是创建一个ClassFileTransformer实例,并覆写此方法

Account类中修改后的方法被修改。代码热更新完成

通过 –XX:+TraceClassLoading 输出如下

java 热更新class_线上java热更新代码实现相关推荐

  1. konfig:采用ConfigMap实现线上配置热更新

    前言 利用kubernetes部署应用越来越流行,而运行在kubernetes中的服务需要的各种各样的配置如何才能实现热更新?难道需要在kubernetes中再部署zookeeper或者etcd之类的 ...

  2. JAVA计算机毕业设计校园线上点餐系统Mybatis+源码+数据库+lw文档+系统+调试部署

    JAVA计算机毕业设计校园线上点餐系统Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计校园线上点餐系统Mybatis+源码+数据库+lw文档+系统+调试部署 本源码技术栈 ...

  3. java毕业生设计中学线上作业评判系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计中学线上作业评判系统计算机源码+系统+mysql+调试部署+lw java毕业生设计中学线上作业评判系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S ...

  4. java毕业生设计校园线上点餐系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计校园线上点餐系统计算机源码+系统+mysql+调试部署+lw java毕业生设计校园线上点餐系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

  5. Java毕设项目餐厅线上点菜系统计算机(附源码+系统+数据库+LW)

    Java毕设项目餐厅线上点菜系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  6. JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署

    JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署 ...

  7. java毕业设计“西单”甜品线上预定系统mybatis+源码+调试部署+系统+数据库+lw

    java毕业设计"西单"甜品线上预定系统mybatis+源码+调试部署+系统+数据库+lw java毕业设计"西单"甜品线上预定系统mybatis+源码+调试部 ...

  8. java计算机毕业设计中学线上作业评判系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计中学线上作业评判系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计中学线上作业评判系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构 ...

  9. java计算机毕业设计闲置物品线上交易系统源码+数据库+lw文档+系统+部署

    java计算机毕业设计闲置物品线上交易系统源码+数据库+lw文档+系统+部署 java计算机毕业设计闲置物品线上交易系统源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

最新文章

  1. SXOI2019游记
  2. ROSA 2012 Enterprise Linux Server 发布
  3. 在reader中勾选pdf复选框_绝对可勾选的在WORD 2003中加入复选框的方法
  4. python网址在浏览器能打开_Python - Flask - 在默认浏览器中打开一个网页
  5. ASP.NET MVC Action Filters
  6. python怎么做软件界面_python – 如何自定义桌面应用程序的标题栏和窗口
  7. php Switch语句
  8. ExtJs中Store简介(秘籍)
  9. c++水平制表符怎么用_怎么才能把字写得好看一些?这四个方法用对了,水平会提升...
  10. Oracle11g的安装和使用
  11. awr报告与statspack报告
  12. 海思AI芯片3559A方案学习(一)
  13. 交替性注意力_玩出专注力 一次对付五种儿童专注力不足!
  14. 2019 年数据仓库 BI 及 Data Science 最全书单
  15. Maven详解【Idea搭建Maven项目、Maven常用指令、Maven的传递性和依赖性、排除依赖】
  16. 区间缩放,标准化,归一化
  17. 电脑硬盘坏了怎么修复
  18. 点积、内积、外积、叉积、张量积——概念区分
  19. 基于单片机的智能教室控制系统的设计
  20. android自定义起止时间的时间刻度尺,Android 自定义View篇(六)实现时钟表盘效果...

热门文章

  1. python五种标准数据类型_python标准数据类型--数值
  2. python协程池_python3下multiprocessing、threading和gevent性能对比—-暨进程池、线程池和协程池性能对比 | 学步园...
  3. R8-1 中序和后序创建二叉树
  4. IDEA破解补丁激活方式
  5. 趣图 | 小哥哥你怎么那么高冷呀?
  6. 翻译翻译,什么叫他妈的惊喜?
  7. 【微信小程序】微信小程序函数封装
  8. python 自动化测试(2):针对密码输入框为密码控件时的解决方案
  9. 【檀越剑指大厂—SpringMVC】SpringMVC篇
  10. js 手机号码和电话号码(座机号)正则校验