JVM TI学习(2) 若何动态更新JVM中的class文件[Java编程]
本文“JVM TI学习(2) 若何动态更新JVM中的class文件[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在一个运营系统中,假如呈现业务办法变更,而我们利用的利用服务器不支持热布置的话,那么重启大概是更新的唯一挑选.目前大都利用服务器不支持热布置,包含生产情势下的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() 判断一下.
以上是“JVM TI学习(2) 若何动态更新JVM中的class文件[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |