- 浏览: 361134 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (176)
- struts2 (4)
- javascript (9)
- database (11)
- hibernate (11)
- java (36)
- CSS (1)
- wap (8)
- html (5)
- spring (3)
- 操作系统 (9)
- xml (0)
- eclipse/myeclipse (6)
- freemarker (2)
- jsp+servlet (4)
- fckeditor (1)
- Linux (12)
- tomcat (4)
- SNMP (2)
- Loadrunner (1)
- php (0)
- 版本控制 (1)
- android (3)
- pki (7)
- jquery (4)
- webservice (4)
- ipad (1)
- 开发工具 (1)
- jslt (1)
- 连接池 (6)
- javaApi (1)
- 学习笔记 (6)
- eclipse (2)
最新评论
-
宋建勇:
nice
keytool详解 -
1122334455aabb:
java int,byte、char之间的相互转化,更多内容参 ...
java中byte 与16进制字符相互转换 -
01jiangwei01:
CA[i >>> 18 & 0x3f ...
使用JAVA数字证书做数字签名认证 -
sjp524617477:
good
keytool详解 -
whlngn:
输出结果我只想取汉字,而不要后面的数字,应该如何实现,求回答
配置paoding analysis
应用服务器一般都支持热部署(Hot
Deployment),更新代码时把新编译的确类替换旧的就行,后面的程序就执行新类中的代码。这也是由各种应用服务器的独有的类加载器层次实现的。那
如何在我们的程序中也实现这种热加载功能呢?即要在虚拟机不关闭的情况下(比如一个),换个类,JVM
就知道加载这个新类,执行新类中的逻辑呢?下面就简单演示这样一个热加载的例子,首先大致了解一下类加载器。
标准 Java 启动器的类加载器层次
1. 引导类加载器(bootstrap): 加载内核 API,如 rt.jar(java.lang、java.io 等)
2. 扩展类加载器(extension): 加载的默认扩展来自于 jre/lib/ext
3. 系统类加载器(system): 类路径上的类,如 com.unmi.*
说明:这只是标准 Java
启动器运行程序时的类加载器层次,像应用服务器中的类加载器通常会多一两层,也是在这个基础上的延伸。上面的类加载层次存在自上而下的委托关系,委托加载
不在这里细讲。
类加载器的规则有三
1. 一致性规则:类加载器不能多次加载同一个类
2. 委托规则 :在加载一个类之前,类加载器总参考父类加载器
3.
可见性规则:类只能看到由其类加载器的委托加载的其他类,委托是类的加载器及其所有父类加载器的递归集。(这个规则可能不太好理解,要举个例子就很容易理
解的,这里也不细说)
实际的例子演示热加载
1. 建立工程,编写代码
前面铺垫的应该够厚了,开始用个例子来说明感受类的热加载(又名热部署 Hot Deployment)。这个例子采用 Eclipse
来做,首先要建立两个普通的 Java 工程,分别是 TestHotDeployInf 和 TestHotDeployImpl。让
TestHotDeployImpl 依赖于 TestHotDeployInf 工程,即在 TestHotDeployImpl 的 Build
Path 中,Projects 标签页里把 TestHotDeployInf 工程选进来,因为编译 TestHotDeployImpl
中的类要用到 TestHotDeployInf 中的类。
然后在工程式 TestHotDeployInf 中新建一个接口(Cat.java) 和一个类(Client.java),内容分别是:
Cat.java(Cat 接口类,也可以用抽象类,用来引用需热加载的实现类的实例)
- package com.unmi;
- /**
- * Cat 接口,要热加载的类一定要有一个接口或基类引用
- * @author Unmi
- */
- public interface Cat {
- public void miaow();
- }
package com.unmi;
/**
* Cat 接口,要热加载的类一定要有一个接口或基类引用
* @author Unmi
*/
public interface Cat {
public void miaow();
}
Client.java(测试热加载的客户端类)
- package com.unmi;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.net.URL;
- import java.net.URLClassLoader;
- /**
- * 测试热部署 Hot Deployment 的客户端类
- * @author Unmi
- */
- public class Client {
- private static ClassLoader cl;
- private static Class catClass;
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception{
- BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
- Cat cat = createCat();
- System.out.println( "miaow, reload, or exit" );
- while ( true ){
- String cmd = br.readLine();
- if (cmd.equalsIgnoreCase( "exit" )){
- return ;
- } else if (cmd.equalsIgnoreCase( "reload" )){
- reloadImpl();
- cat = createCat();
- System.out.println( "CatImpl reloaded." );
- } else if (cmd.equalsIgnoreCase( "miaow" )){
- cat.miaow();
- }
- }
- }
- /**
- * 使用加载的类 Cat 类创建 Cat 实例
- * @return Cat 实例
- * @throws Exception
- */
- public static synchronized Cat createCat() throws Exception{
- if (catClass== null ){
- reloadImpl();
- }
- Cat newCat = (Cat)catClass.newInstance();
- return newCat;
- }
- /**
- * 用自定义的类加载器重新加载 ../TestHotDeployImpl/bin 目录中的 CatImpl 实现类
- * 注意这里的 ../TestHotDeployImpl/bin,方便直接读取 TestHotDeployImpl 下随时
- * 修改后编译成的新的 com.unmi.CatImpl 类,避免了 class 文件编译后拷贝到别处
- * @throws Exception
- */
- public static synchronized void reloadImpl() throws Exception{
- URL[] externalURLs = new URL[]{ new URL( "file:../TestHotDeployImpl/bin/" )};
- cl = new URLClassLoader(externalURLs);
- catClass = cl.loadClass( "com.unmi.CatImpl" );
- }
-
}
- 还要在 TestHotDeployImpl 中添加一个 Cat 的实现类 CatImpl
- package com.unmi;
- /**
- * Cat 的实现类,观察是否加载了最新代码,可通过改变 miaow() 方法的输出
- * @author Unmi
- */
- public class CatImpl implements Cat {
- @Override
- public void miaow() {
- System.out.println( "I'm Hello Kity, I like play with you." );
- //System.out.println("I'm Tom, Jerry always kids me.");
- }
- }
2. 进行测试
运行 TestHotDeployInf 中的 Client 程序,按照下图中的指令说明,可观察到热加载的过程:
3. 几个问题
1) 为什么要在单独的工程里放置 CatImpl 类(重要)
主要是为了编译成的 CatImpl 类对于 TestHotDeployInf 的系统加载类不可见,就是不能放在 TestHotDeployInf 的程序的 classpath 中。
这个问题可以说大,本应该提高一个层次来说明它。前面提过标准 Java 启动器加载器层次中有三个加载器,而在上面的 Client.java 中,我们看到用了一个自定义的 cl = new URLClassLoader(externalURLs) 类加载器来加载 com.unmi.CatImpl。也就是标准的类加载器又多了一层,这里估且把它叫做应用程序加载器(AppClassloader)。
根据委托规则,执行 Client 时,要加载 com.unmi.CatImpl 时会首先委托加载 Client 类本身的系统加载器加载。如果编译出的 CatImpl.class 放在 Cat.class 相同的位置,那么就由系统加载器来加载 com.unmi.CatImpl,自定义加载器 cl 是没机会了。所以必须放在外面让系统加载器看不到 com.unmi.CatImpl 类。
再依据一致性规则,如果系统加载器能加载了 com.unmi.CatImpl 类,以后你怎么修改 CatImpl 类,替换掉原来的类,内存中总是最先加载的那个 com.unmi.CatImpl 类版本。因为类只会加载一次。而用自定义的 cl 可不一样了,每次执行 cl.loadClass("com.unmi.CatImpl") 时都是用的一个新的 ClassLoader 实例,所以不受一致性规则的约束,每次都会加载最新版本的 CatImpl 类。
2) 关于类的卸载的问题
上一条讲了加载 com.unmi.CatImpl 时,每次都 new 了一个新了 ClassLoader 实例,每次都加载最新的 CatImpl 类,那就引出了不再使用的 ClassLoader 实例和早先旧版本的 CatImpl 类实例的回收问题。在多数 JVM 中,它们如同普通的 Java 对象一样的处理,当它们无从触及时被当作垃圾被收集掉。也可能在某些 JVM 中这种情况对 ClassLoader 和旧版本 Class 实例的回收要特殊关照一下。
这里的 Class 实例,就是对象调用 getClass() 得到的实例,如 CatImpl.getClass()。类实例和类加载器是相关联的,所有会出现这样的问题,相同类的静态变量可能表现为不同的值,因为它们可能是由不同 的类加载器加载的。
发表评论
-
常用排序算法小记
2012-06-29 07:59 965转自:http://easense2009.iteye.com ... -
抽象类与接口
2012-06-07 13:47 809java中只可以继承一个类却可以继承多个接口。一个抽象 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-05-18 09:36 654最近的机器内存又爆满了,除了新增机器内存外,还应该好好revi ... -
Runtime.getRuntime().exec(...)使用方法
2011-01-25 11:06 3315如果想要了解更多的信息,参阅代码里面给的链接 下面是这个正确的 ... -
使用poi一步一步建立报表 (excel操作)
2011-01-08 20:21 1626... -
Apache POI HSSF读写Excel总结
2011-01-08 18:03 1368Apache POI HSSF和XSSF读写EXCEL总结 H ... -
JNLP介绍
2010-12-05 15:04 1904原文地址:http://blog.csdn.net/yq7 ... -
利用反射私有属性/方法进行设置/调用
2010-12-03 08:35 1155因一时兴起看了一些有关 Java 反射( Reflection ... -
如何编写高效率java代码
2010-09-08 12:38 1516如何编写高效率Java 规则1 用时间频度来确定异常情况 ... -
深入理解Java加载类的机制
2010-09-07 22:32 1156这里从三个方面讲述java classloader ... -
Java 动态加载类
2010-09-07 22:29 2311Java 动态加载类 收 ... -
ResourceBundle与Properties两个类的区别
2010-08-26 14:09 1633这两个类都是读取properties格式的文件的,而Prope ... -
log4j多文件配置
2010-08-26 10:07 1529log4j.rootCategory=INFO, CONSOL ... -
java获取properties 配置文件
2010-08-26 09:21 1786根据网上的例子总结了一下。 其中cache.p ... -
Class.forName与new 得区别
2010-08-13 15:45 1096Class.forName(xxx.xx.xx) 返回一个类 ... -
HttpURLConnection简单用法
2010-08-04 15:00 1624HttpURLConnection为javaAPI提 ... -
java中byte 与16进制字符相互转换
2010-07-27 13:53 7479Java中byte用二进制表示占用8位,而我们知道16进制的每 ... -
使用Axis在Tomcat下发布Webservice操作指南
2010-06-21 12:58 2497最近在工作过程中总是需要向其它项目组提供Webservice ... -
jdk安装
2010-06-12 21:41 14761.1 获取 JDK Java 的 ... -
System.load 和 System.loadLibrary
2010-06-12 08:37 1473System.load 和 System.loadLibrar ...
相关推荐
然而,通过特定的工具和策略,可以在运行时动态替换已加载的类,实现所谓的“热部署”(Hot Deployment)或“热更新”(Hot Swap)。 文章《热加载类》可能详细探讨了以下几点: 1. 类加载机制:首先,我们需要...
当我们谈论Spring Boot的热部署(Hot Deployment)时,我们指的是在开发过程中,当源代码发生更改时,应用能够自动检测到这些变化并重新加载,而不需要手动重启整个应用程序服务器。 传统的Java Web应用开发中,...
在Java开发环境中,热加载(Hot Deployment)是一种提高开发效率的技术,它允许开发者在不重启应用服务器的情况下更新类文件,从而快速验证代码更改的效果。"class文件热加载,上传class文件实现热加载"这个主题主要...
对于希望进行0基础学习Linux运维的人员来说,掌握Deployment和Service的使用是搭建可靠、可扩展的应用服务环境的基本技能之一。通过实践这些概念,可以帮助运维人员或开发人员更好地理解和利用Kubernetes的强大功能...
在某些情况下,为了确保最新的类优先被加载,需要对类加载器的策略进行调整。本文将详细介绍如何在Rational Application Developer (RAD)环境中设置类加载器策略,以及在WAS服务器端进行相应的配置。 #### 二、类...
web deployment project web deployment project web deployment project web deployment project web deployment project
例如,在需要对程序进行热部署(Hot Deployment)时,动态加载类文件就是一种有效的手段。此外,对于某些需要根据用户权限加载特定功能模块的应用场景,动态加载也能够提供安全和灵活的解决方案。 最后,文章指出,...
Java 类的热重载(Hot Deployment)或热替换(Hot Swap)是开发过程中非常实用的功能,它允许开发者在不重启应用程序服务器(如Tomcat)的情况下更新已部署的类,从而提高开发效率。在这个例子中,我们将探讨如何在...
在Java开发过程中,为了提高开发效率和调试便捷性,我们经常需要实现类的热替换(Hot Deployment),也就是在不重启应用的情况下更新或替换已加载的类。Java类热替换技术通常涉及类加载器(ClassLoader)的自定义...
在实际应用中,网络类加载器的实现可能还需要与其他功能结合,比如热部署(Hot Deployment),允许开发者在不中断应用程序的情况下更新代码。此外,还可以扩展类加载器以支持多种不同的类存储格式,如JAR、WAR等。 ...
在Java开发环境中,热部署(Hot Deployment)是一种非常实用的功能,它允许开发者在不中断应用程序运行的情况下更新或替换已部署的代码。这大大提高了开发效率,减少了系统停机时间。以JBOSS为例,它是Java EE应用...
Continuous Deployment of Mobile Software at Facebook Abstract Continuous deployment is the practice of releasing software updates to production as soon as it is ready, which is receiving increased ...
Microsoft Deployment是Microsoft提供的一种解决方案加速器,用于帮助企业高效地部署Windows操作系统、Microsoft Office系统以及Office 2003。这个工具集旨在优化IT专业人员的工作流程,提高投资回报率(ROI),并确保...
Hot Deployment的实现往往依赖于自定义类加载器的高级功能,它能够检测到类文件的变化,并自动进行卸载和重新加载,确保应用程序始终处于最新状态。 #### 结语 类加载器作为Java动态性的基石,其背后的运作机制远...
但有一种称为"热部署"(Hot Deployment)或"热替换"(Hot Swap)的技术,可以在不重启应用的情况下替换已加载的类。这通常在开发环境中使用,以提高调试效率。JVM通过一些工具和插件,如JRebel、JBoss ClassLoader、...
8. **测试与优化**:最后,进行测试以确保一切正常运行,并根据实际需求进行调整。例如,优化更新策略,确保软件分发效率和成功率。 通过`2.1 Deployment Server Configuration.doc`文档,你可能会找到更详细的步骤...
WebDeployment技术是与Visual Studio 2005紧密集成的一种发布和部署Web应用程序的方法。它极大地简化了将ASP.NET应用程序从开发环境推送到生产环境的过程,使得开发者可以更高效地管理他们的Web项目。 在Visual ...
本篇文章将通过一个简单的例子来介绍如何在MyEclipse环境中搭建Activiti开发环境,以及如何使用Activiti进行基本的流程定义和执行。 #### 二、准备工作 1. **环境准备**: - 操作系统:Windows 7 64位 - IDE:...
4. **本地BU配置**:进入`deployment/local`目录,编辑`rms1-server.xml`,可以参考`demo/demo-rms1-server.xml`并进行修改。这个配置文件对于RMS1服务器的运行至关重要,需要根据实际需求进行调整。 以上步骤是RMS...