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生成二维码可添加logo和文字功能
2021-06-23 22:24:35
Java移动文件夹及其所有子文件与子文件夹
2023-08-01 09:53:38
带你重新认识MyBatis的foreach
2023-11-21 08:44:54
C#实现农历日历的方法
2022-08-17 21:27:29
Spring+Vue整合UEditor富文本实现图片附件上传的方法
2022-09-27 10:36:13
详解Spring中使用@within与@target的区别
2022-11-18 17:58:24
C#面向对象编程之猜拳游戏实现方法
2021-11-17 23:25:52
Java二分查找算法实现代码实例
2023-08-24 05:34:23
Android应用创建桌面快捷方式代码
2022-03-03 00:51:44
第三方包jintellitype实现Java设置全局热键
2023-09-25 10:33:50
Android自定义listview布局实现上拉加载下拉刷新功能
2023-05-12 23:27:28
在IDEA中安装MyBatis Log Plugin插件,执行mybatis的sql语句(推荐)
2022-02-17 08:04:43
C#泛型的逆变协变之个人理解
2021-05-28 16:33:03
java 可变参数详解及实例
2021-06-01 10:02:42
解决IDEA maven 项目修改代码不生效,mvn clean、install后才生效
2022-06-19 12:17:06
Android开发中解析xml文件XmlUtils工具类与用法示例
2023-03-26 01:05:45
Maven工程pom中如何定义jdk版本
2022-02-18 08:16:13
Java中避免NullPointerException的方法总结
2021-08-29 08:09:24
Java byte数组操纵方式代码实例解析
2022-02-18 16:54:12
Servlet3.0学习总结之基于Servlet3.0的文件上传实例
2023-09-02 01:51:33