java 热替换_class卸载、热替换和Tomcat的热部署的分析

本文深入分析了Java中类的热替换、卸载以及Tomcat的热部署机制。通过自定义ClassLoader `HotSwapURLClassLoader` 实现类的热替换,展示了在程序运行时修改类文件并观察到类被重新加载的效果。同时讨论了类卸载的条件和限制,并给出`SimpleURLClassLoader`示例。在Tomcat中,热部署涉及到Context的卸载和重新加载,确保应用的更新。最后,指出了 PermGen space 溢出的问题及其原因。
摘要由CSDN通过智能技术生成

所以一个class被一个ClassLoader实例加载过的话,就不能再被这个ClassLoader实例再次加载(这里的加载指的是,调用了defileClass(...)放方法,重新加载字节码、解析、验证。)。而系统默认的AppClassLoader加载器,他们内部会缓存加载过的class,重新加载的话,就直接取缓存。所与对于热加载的话,只能重新创建一个ClassLoader,然后再去加载已经被加载过的class文件。

下面看一个class热加载的例子:

代码:HotSwapURLClassLoader自定义classloader,实现热替换的关键

1 package testjvm.testclassloader;

2

3 import java.io.File;

4 import java.io.FileNotFoundException;

5 import java.net.MalformedURLException;

6 import java.net.URL;

7 import java.net.URLClassLoader;

8 import java.util.HashMap;

9 import java.util.Map;

10

11 /**12 * 只要功能是重新加载更改过的.class文件,达到热替换的作用13 *@authorbanana14 */

15 public class HotSwapURLClassLoader extends URLClassLoader {

16     //缓存加载class文件的最后最新修改时间17     public static Map cacheLastModifyTimeMap = new HashMap();

18     //工程class类所在的路径19     public static String projectClassPath = "D:/Ecpworkspace/ZJob-Note/bin/";

20     //所有的测试的类都在同一个包下21     public static String packagePath = "testjvm/testclassloader/";

22

23     private static HotSwapURLClassLoader hcl = new HotSwapURLClassLoader();

24

25     public HotSwapURLClassLoader() {

26         //设置ClassLoader加载的路径27         super(getMyURLs());

28     }

29

30     public static HotSwapURLClassLoader  getClassLoader(){

31         return hcl;

32     }

33

34     private static  URL[] getMyURLs(){

35         URL url = null;

36         try {

37             url = new File(projectClassPath).toURI().toURL();

38         } catch (MalformedURLException e) {

39             e.printStackTrace();

40         }

41         return new URL[] { url };

42     }

43

44     /**45 * 重写loadClass,不采用双亲委托机制("java."开头的类还是会由系统默认ClassLoader加载)46 */

47     @Override

48     public Class> loadClass(String name,boolean resolve) throws ClassNotFoundException {

49         Class clazz = null;

50         //查看HotSwapURLClassLoader实例缓存下,是否已经加载过class51 //不同的HotSwapURLClassLoader实例是不共享缓存的52         clazz = findLoadedClass(name);

53         if (clazz != null ) {

54             if (resolve){

55                 resolveClass(clazz);

56             }

57             //如果class类被修改过,则重新加载58             if (isModify(name)) {

59                 hcl = new HotSwapURLClassLoader();

60                 clazz = customLoad(name, hcl);

61             }

62             return (clazz);

63         }

64

65         //如果类的包名为"java."开始,则有系统默认加载器AppClassLoader加载66         if(name.startsWith("java.")){

67             try {

68                 //得到系统默认的加载cl,即AppClassLoader69                 ClassLoader system = ClassLoader.getSystemClassLoader();

70                 clazz = system.loadClass(name);

71                 if (clazz != null) {

72                     if (resolve)

73                         resolveClass(clazz);

74                     return (clazz);

75                 }

76             } catch (ClassNotFoundException e) {

77                 //Ignore78             }

79         }

80

81         return customLoad(name,this);

82     }

83

84     public Class load(String name) throws Exception{

85         return loadClass(name);

86     }

87

88     /**89 * 自定义加载90 *@paramname91 *@paramcl92 *@return93 *@throwsClassNotFoundExc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用IDEA和Tomcat进行开发时,可以通过配置实现热部署,无需重启项目。具体的配置步骤如下所示: 1. 打开IDEA开发工具,并打开Java的Web项目。 2. 点击"Run"菜单,选择"Edit Configurations"。 3. 在"Run/Edit Configurations"对话框中,点击左上角的加号,选择"Tomcat Server",然后选择"Local"子菜单。 4. 设置一个名称,如果之前没有关联过Tomcat,需要先关联一个Tomcat,关联Tomcat时选择"Application server"的"Configure"按钮。 5. 在"Application Servers"对话框中,点击加号,设置一个下载好的Tomcat目录路径来关联Tomcat。 6. 在"Run/Debug Configurations"对话框中,选择"Deployment"选项卡,对需要部署的项目文件进行设置。 7. 点击加号选择"Artifact",然后选择"war exploded"方式,这种方式是以文件夹方式部署的,而"war"是以war包方式部署的。"exploded"方式支持热部署,在开发时选择"exploded"方式即可。 8. 添加完"Artifact"文件后,可以设置"Application context",用来指定应用的路径。 9. 然后回到"Server"选项卡,设置"On Update action"和"On frame detection"选项,都设置为"Update classes and resources",表示classes文件和资源文件都会被更新。 10. 如果只设置了"On Update action"选项,则每次需要手动点击更新。而设置了"On frame detection",则会监测窗口,当IDEA窗口发生切换时会自动更新文件。 通过上述配置,可以实现IDEA和Tomcat热部署功能,无需重启项目。这样可以提高开发效率,节省时间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [idea下实现tomcat热部署(修改class等不重启项目)](https://blog.csdn.net/mudisheng0202/article/details/127045222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Tomcat服务器热部署和IDEA热部署](https://blog.csdn.net/weixin_46565024/article/details/122788219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [如何在idea中设置Tomcat热部署](https://blog.csdn.net/zc1320030382/article/details/79217369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值