JVM TI学习(2) 如何动态更新JVM中的class文件

在一个运营系统中,如果出现业务方法变更,而我们使用的应用服务器不支持热部署的话,那么重启可能是更新的唯一选择。目前多数应用服务器不支持热部署,包括生产模式下的weblogic。之所以说是生产模式,weblogic在开发模式下是支持这种动态更新的,即我们只要替换部署目录下的类文件,重新访问时可以看到新业务方法生效,而且即使在生产模式下,weblogic也能"支持"动态更新,但做法上比较麻烦,需要使用version信息控制应用,这个功能weblogic9就开始提供,但好像很少有客户这么用过。如果应用服务器不支持动态更新,我们有什么方法可以满足这种需求吗?这就是我们这篇文章要讲述的,通过TI(更准确地说是JDI),我们可以实现。

为了能够正确的做到动态更新,我们首先需要attach到target JVM上,具体方法参考http://www.blogjava.net/fjin/archive/2009/09/10/294443.html

连接上target JVM后,我们可以就可以利用vm提供的redefineClasses()将新的类文件注入到JVM中,替代原有的class信息。

1     public void reloadClasses(List toReloads){
2         Map toReloadMap = new HashMap();
3         for (Iterator iterator = toReloads.iterator(); iterator.hasNext();)
4         {
5             String toReload = (String) iterator.next();
6             InputStream is = VMDebugger.class.getClassLoader().getResourceAsStream(toReload.replace('.', '/') + ".class");
7             if (is == null) {
8                 throw new RuntimeException("Class " + toReload + " is not found in current classpath");
9             }
10             List classes = vm.classesByName(toReload);
11             if (classes == null || classes.isEmpty()) {
12                 throw new RuntimeException("Class: " + toReload + " is not found in target JVM");
13             } else {
14                 ReferenceType ref = (ReferenceType) classes.get(0);
15                 try{
16                     toReloadMap.put(ref, toByteArray(is));
17                 }catch(Exception e){
18                     e.printStackTrace();
19                 }
20             }
21         }
22         vm.redefineClasses(toReloadMap);
23     }

上面的方法有如下几个注意的地方:

1:确保要更新的类在当前classpath下(也就是启动VMDebugger的classpath)。

2:确保要更新的类在target JVM已被加载。

3:不同的VM实现上不一样,有的可能不允许动态更新,可以使用canRedefineClasses() 判断一下。

时间: 2024-11-03 20:46:15

JVM TI学习(2) 如何动态更新JVM中的class文件的相关文章

动态更新项目中使用的jquery包

问题描述 动态更新项目中使用的jquery包 [b][b]我在项目中,把js分离了 ,把些在页面的 js 放在 自己建立的jquery 文件里,然后动态引用到页面上,但是因为很多浏览器在一定的时间里没有把上次下载下来的jquery清空,我发布在服务器的上 最新jquery 不能及时被下载到 客户本地的浏览器缓存里,想用一个,版本号或着其他方式 ,来实现我发布最新的jquery浏览器就去到服务器抓取最新的jquery包.[/b][/b][b][/b] 解决方案 将你的jquery放入一个文件中,其

JVM TI学习(1) 如何中断weblogic中stuck thread

JPDA(Java Platform Debugger Architecture)是sun推出的一套工具接口,有了这些接口,debugger.profile工具可以attach到target JVM,进而可以监控.调试我们的程序.JPDA包括三部分:JVM TI, JDI, JDWP.TI可以使用native语言,通过调用jvmti.c提供的系列库函数,实现debug工作,而JDI是TI面向Java开发人员提供的高层开发接口.TI代替了早期的DI,每个版本都做了一定的功能增强.随着JDK的发展,

Android编程实现动态更新ListView的方法_Android

本文实例讲述了Android编程实现动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.从今天起,每次学习的源代码都会打包上传,方便各位同学学习,注册帐号即可下载. 布局main.xml: <?xml

Android零基础入门第44节:ListView数据动态更新

原文:Android零基础入门第44节:ListView数据动态更新    经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是静态的,但在实际开发中,这些数据往往都是动态变化的,比如数据内容发生改变.增加几行.或者删除几行,这就涉及到ListView数据的更新问题.     接下来通过一个简单的示例程序来学习ListView的数据更新.     继续使用WidgetSample工程,在app/main/res/lay

iOS 利用 framework 进行动态更新

前言 目前 iOS 上的动态更新方案主要有以下 4 种: HTML 5 lua(wax)hotpatch react native framework 前面三种都是通过在应用内搭建一个运行环境来实现动态更新(HTML 5 是原生支持),在用户体验.与系统交互上有一定的限制,对开发者的要求也更高(至少得熟悉 lua 或者 js). 使用 framework 的方式来更新可以不依赖第三方库,使用原生的 OC/Swift 来开发,体验更好,开发成本也更低. 由于 Apple 不希望开发者绕过 App

通过XML数据交换实现XForm DataInstance的动态更新

XForms 是下一代 Web 表单的数据处理技术,它通过 Data Instance(数据实例),定义表单上所有和后端应用关联的数据信息,实现各种数据处理,实现了 MVC 中的数据 Modle 与 View 和 Controller 的清晰分离.本文首先 IBM Lotus Forms 进行简单介绍,然后结合作者的项目开发经验,提出了 XForms 在实际表单应用中的一个典型的动态数据交换的应用场景.针对该应用场景,将由浅入深的为大家介绍通过 XForm 的 XML 数据交换,实现 DataI

Ajax基础教程(4)- 实现基本Ajax技术 4.7 动态更新Web页面

如前所述,如果页面中只有一小部分需要修改,此时Ajax技术最适用.换句话说,以前实现一些用例时,为了更新页面中的一小部分总是需要使用完全页面刷新,这些用例就很适合采用Ajax技术. 考虑一个有单个页面的用例,用户向这个页面输入的信息要增加到列表中.在这个例子中,你会看到列出某个组织中员工的Web页面.页面最上面有3个输入框,分别接受员工的姓名.职位和部门.点击Add(增加)按钮,将员工的姓名.职位和部门数据提交到服务器,在这里将这些员工信息增加到数据库中. 当使用传统的Web应用技术时,服务器以

WF中的动态更新

关于动态更新 在开发工作流时,我们会在工作流设计器中通过拖拽活动,设置属性等等来设计我们的工作流,我们 希望我们在设计时定义好的工作流在运行时是不变的.但在实际中我们往往需要在运行时来改变工作流 的架构,例如我们已经定义好的流程在没有结束时我们需要增加一个流程点,这个时候我们就需要使用 动态更新来现实.在WF中我们也可以对正在运行的工作流实例添加删除活动,修改活动,规则条件等. 当动态更新应用到工作流实例上时,只影响当前的工作流实例.其他的和将来的都不受影响,仍然使用 原始的工作流定义. 动态更

手动做动态更新的Ghost映象文件

  Ghost的的出现需要几个小时才能重装系统的工作一下子缩短到了十几分钟.但因为Ghsot的映像文件只能是备份静态的信息,所以对于时时刻刻都需要备份重要信息的我们是一件非常头疼的事情.对于这种情况您是怎么处理的?是手动备份还是不要了?如果一个不小心忘记备份哪份重要文件,损失可就大了.所以今天我们来对系统进行一次大手术,做一份动态更新的Ghost映象文件,把恢复系统的损失降到最低点. 做映象文件当然要从初装系统说起(因为这时候做的映象文件和重装系统没什么两样嘛).本文以WindowsXP为例,其