Java ClassLoader虚拟类实现代码热替换的示例代码

作者:lolxxs 时间:2022-06-25 03:08:52 

改进思考

  • 正常实现流程应该为继承ClassLoader虚拟类,并重写其loadClass方法和findClass方法,并在loadClass方法中调用findClass方法,在findClass方法中再调用defineClass方法

  • 实现热替换应该是替换修改过的代码,则应当维护一个Map<String, Long> 存储从全限定类名到上次文件修改时间的映射,每次定时扫描Class文件目录或检测到保存快捷键Ctrl+s时触发扫描,文件的属性也有上次修改时间,拿我们存储的和文件的属性比较即可知道文件是否修改,即是否需要重新加载Class类

  • 热替换产生了大量类信息都存储在jdk1.7的永久代,jdk1.8的元空间,如果无用的类信息过多则会造成OOM,我们自定义类加载器和其产生的Class类对象,都可以通过置空(= null)使其不可达,然后调用System.gc()就可以卸载,即类似如下代码

public class Test extends ClassLoader {
  public static void main(String[] args) throws Exception {
    MyClassLoader classLoader = new MyClassLoader();
 Class classLoaded = classLoader.loadClass("MyClass");
  classLoaded = null;
 classLoader = null;
  System.gc();  
 }
}

来源:https://blog.csdn.net/weixin_45754452/article/details/125231615

标签:Java,ClassLoader,热替换
0
投稿

猜你喜欢

  • Java实现矩阵加减乘除及转制等运算功能示例

    2023-07-05 04:49:53
  • Java 程序设计总复习题(java基础代码)

    2022-05-11 07:02:31
  • 使用栈的迷宫算法java版代码

    2022-03-07 12:47:16
  • java中javaBean与Bean的深入理解

    2021-11-27 13:19:11
  • Java Code Cache满导致应用性能降低问题解决

    2021-06-18 18:17:56
  • 详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类

    2021-08-04 03:16:28
  • 基于ThreadLocal 的用法及内存泄露(内存溢出)

    2023-11-23 20:22:28
  • Java面试题冲刺第二十四天--并发编程

    2023-08-31 05:39:02
  • Java @Deprecated注解的作用及传递性

    2023-08-11 12:55:05
  • ToStringBuilder类的一些心得

    2022-10-10 04:02:27
  • java实现FTP文件上传与文件下载

    2023-08-16 08:28:38
  • spring mvc中@RequestBody注解的作用说明

    2022-04-07 14:15:02
  • 基于Java的打包jar、war、ear包的作用与区别详解

    2023-11-17 11:41:13
  • JAVA抛出异常的三种形式详解

    2022-06-26 22:44:32
  • 详解java 三种调用机制(同步、回调、异步)

    2023-11-25 07:59:57
  • springboot整合quartz项目使用案例

    2023-02-13 19:57:12
  • autoMapping和autoMappingBehavior的区别及说明

    2023-11-29 06:39:25
  • 详解SpringBoot如何实现统一后端返回格式

    2022-11-27 05:26:24
  • C#使用linq查询大数据集的方法

    2023-05-24 16:52:17
  • MyBatis利用MyCat实现多租户的简单思路分享

    2022-08-16 18:58:33
  • asp之家 软件编程 m.aspxhome.com