文档章节

JAVA热部署原理浅析

o黑色乌鸦o
 o黑色乌鸦o
发布于 2016/09/23 16:52
字数 923
阅读 34
收藏 1

1、热部署是什么?

对于Java应用程序来说,热部署就是在运行时更新Java类文件。

2、热部署有什么用?

可以不重启应用的情况下,更新应用。举个例子,就像电脑可以在不重启的情况下,更换U盘。

OSGI也正是因为它的模块化和热部署,才显得热门。

3、热部署的原理是什么?

想要知道热部署的原理,必须要了解java类的加载过程。一个java类文件到虚拟机里的对象,要经过如下过程。

首先通过java编译器,将java文件编译成class字节码,类加载器读取class字节码,再将类转化为实例,对实例newInstance就可以生成对象。

类加载器ClassLoader功能,也就是将class字节码转换到类的实例。

在java应用中,所有的实例都是由类加载器,加载而来。

一般在系统中,类的加载都是由系统自带的类加载器完成,而且对于同一个全限定名的java类(如com.csiar.soc.HelloWorld),只能被加载一次,而且无法被卸载。

这个时候问题就来了,如果我们希望将java类卸载,并且替换更新版本的java类,该怎么做呢?

既然在类加载器中,java类只能被加载一次,并且无法卸载。那是不是可以直接把类加载器给换了?答案是可以的,我们可以自定义类加载器,并重写ClassLoader的findClass方法。想要实现热部署可以分以下三个步骤:

1、销毁该自定义ClassLoader

2、更新class类文件

3、创建新的ClassLoader去加载更新后的class类文件。

示例代码如下:

1 package com.csair.soc.hotswap;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 /**
 6  * 自定义类加载器,并override findClass方法
 7  */
 8 public class MyClassLoader extends ClassLoader{
 9      @Override
10      public Class<?> findClass(String name) throws ClassNotFoundException{
11             try{
12                 String fileName = name.substring(name.lastIndexOf("." )+1) + ".class" ;
13                 InputStream is = this.getClass().getResourceAsStream(fileName);
14                  byte[] b = new byte[is.available()];
15                 is.read(b);
16                  return defineClass(name, b, 0, b. length);
17            } catch(IOException e){
18                  throw new ClassNotFoundException(name);
19            }
20      }
21 }

需要更新的类文件:

1 package com.csair.soc.hotswap;
2 public class HelloWorld {
3      public void say(){
4            System. out.println( "Hello World V1");
5      }
6 }

在工程的根目录下,生成V2版本的HelloWorld.class,内容如下。

1 package com.csair.soc.hotswap;
2 public class HelloWorld {
3       public void say(){
4            System. out.println( "Hello World V2");
5      }
6 }

测试主程序

1 package com.csair.soc.hotswap;
 2 
 3 import java.io.File;
 4 import java.lang.reflect.Method;
 5 
 6 public class Hotswap {
 7      public static void main(String[] args) throws Exception {
 8             loadHelloWorld();
 9             // 回收资源,释放HelloWorld.class文件,使之可以被替换
10            System. gc();
11            Thread. sleep(1000);// 等待资源被回收
12            File fileV2 = new File( "HelloWorld.class");
13            File fileV1 = new File(
14                       "bin\\com\\csair\\soc\\hotswap\\HelloWorld.class" );
15            fileV1.delete(); //删除V1版本
16            fileV2.renameTo(fileV1); //更新V2版本
17            System. out.println( "Update success!");
18             loadHelloWorld();
19      }
20 
21      public static void loadHelloWorld() throws Exception {
22            MyClassLoader myLoader = new MyClassLoader(); //自定义类加载器
23            Class<?> class1 = myLoader
24                      .findClass( "com.csair.soc.hotswap.HelloWorld");//类实例
25            Object obj1 = class1.newInstance(); //生成新的对象
26            Method method = class1.getMethod( "say");
27            method.invoke(obj1); //执行方法say
28            System. out.println(obj1.getClass()); //对象
29            System. out.println(obj1.getClass().getClassLoader()); //对象的类加载器
30      }
31 }

输出结果:

Hello World V1

class com.csair.soc.hotswap.HelloWorld

com.csair.soc.hotswap.MyClassLoader@bfc8e0

Update success!

Hello World V2

class com.csair.soc.hotswap.HelloWorld

com.csair.soc.hotswap.MyClassLoader@860d49

根据结果可以看到,在没有重启应用的情况下,成功的更新了HelloWorld类。

以上只是热部署的最简单的原理实践,实际情况会复杂的多。OSGI的最关键理念就是应用模块(bundle)化,对于每一个bundle,都有其自己的类加载器,当需要更新bundle时,把bundle和它的类加载器一起替换掉,就可以实现模块的热替换。

本文转载自:http://www.cnblogs.com/pfxiong/p/4070462.html?utm_source=tuicool&utm_medium=referral

o黑色乌鸦o
粉丝 7
博文 11
码字总数 3250
作品 0
普陀
程序员
私信 提问
Java web热部署 (Javarebel实现真正高效的tomcat热部署)

Java web开发部署效率浅析 在进行java web程序开发过程中,经常遇到这种问题,修改一个java文件(*.java),需要重启web服务器(如tomcat,weblogic等),部署项目。而起/停服务器浪费了大量的...

coolcooldee
2013/06/04
5.9K
8
SpringBoot 使用devtools热部署

spring boot 热部署 添加依赖 属性文件的修改 springBoot 资源文件属性配置 添加依赖 属性文件的修改 新建 resource.properties 资源引用的配置 springBoot 修改 Server 和Tomcat的配置...

细节探索者
02/20
14
0
Intellij IDEA 配置 JRebel 自动热部署

在Java Web开发中,更新了Java文件后,一般要手动进行Compile->Redeploy(或重启)这两个步骤,浪费不少生命。虽然最新的Intellij IDEA13已经支持热部署,不过依然需要按键。而对于效率至上者,...

BenettX
2014/11/30
834
0
一线互联网公司研发工程师(Java)月薪25-50k的技能要求整理

良好的开发基础,精通Java语言基础,熟练掌握多线程开发技术, 对于Java基础技术体系(包括JVM、类装载机制、JUC、NIO、网络)有深入的理解和实践经验; 熟练掌握常用Java技术框架,能编写高...

vvx1024
2018/01/06
258
0
用resin跑java web项目方法

一、跑项目 准备:Memcached,resin-pro-3.1.8-with-r,java web project 1.把Memcached,resin-pro-3.1.8-with-r解压放到D盘 2.双击Memcached目录下的memcached.exe。打开的时候只有一个黑框...

谢思华
2013/11/15
5K
0

没有更多内容

加载失败,请刷新页面

加载更多

面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
11分钟前
8
0
读书笔记:深入理解ES6 (八)

第八章 迭代器(Iterator)与生成器(Generator) 第1节 循环语句的问题   在循环、多重循环中,通过变量来跟踪数组索引的行为容易导致程序出错。迭代器的出现旨在消除这种复杂性,并减少循...

张森ZS
11分钟前
8
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
15分钟前
8
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
24分钟前
7
0
重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

导读:2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Open Application Model (OAM...

阿里云官方博客
27分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部