本文共 591 字,大约阅读时间需要 1 分钟。
对于一个部署在生产环境的游戏项目来说,我们希望当代码出现bug的时候,可以不用重启游戏进程而达到动态修改代码的目的——
这就是代码热部署!
我们先来看一下,不同编程语言是如何实现代码热部署的。
使用Javascript写过网页的童鞋们都清楚,修复代码后直接刷新一下浏览器,就可以执行最新的脚本;游戏客户端脚本Lua也是如此,在游戏运行过程中可以动态卸载已加载的文件再重新加载,神不知鬼不觉就把bug修复了;Erlang在游戏服务端应用也相当广泛,函数式语言尽可能不使用全局性变量,状态都是用函数参数保存,天然无状态的特性使得代码热部署变得相当简单……
了解过jvm的朋友们都知道,jvm使用类加载器和类的全路径名称结合起来标识一个类,以此来保证同一个类只能被一个类加载器所加载。因此,我们无法要求jvm主动卸载一个类而修改类代码,除非使用新的自定义类加载器。
利用JDK5的Instrumentation提供的接口,我们可以动态改变JVM已加载的类的方法体。
在JDK5 中,Instrumentation 要求在运行前利用或者系统参数来设置代理类。而 Java SE 6 的新特性改变了这种情况,通过 Java Tool API 中的 attach 方式,我们可以很方便地在运行过程中动态地设置加载代理类,以达到 instrumentation 的目的。
下边演示热部署的操作过程
转载地址:http://dsam.baihongyu.com/