Java不重启加载新的class文件

场景定时任务目录增加新的定时任务,定时任务通过反射调用,验证是否需要重启java进程,经验证可行,总结如下:

Java 类加载行为

1. Classpath 固定

  • JVM 启动时确定 ClassLoader 的加载路径(目录或 jar),运行中不会自动变化。
  • 新增的目录需要在 classpath 中才能被加载。

2. 懒加载

  • 类只在第一次使用(Class.forName 或实际引用)时才加载。
  • 启动时不会把目录里所有 class 全部加载到内存。

3. 加载失败

  • 第一次找不到类(ClassNotFoundException)不会被永久锁定。
  • 下一次尝试加载时,如果 classpath 中已有文件,ClassLoader 会重新尝试并可以成功。

4. 加载成功

  • 一旦成功加载,Class 对象会常驻内存。
  • 同一个 ClassLoader 下,同名类永远使用内存中的 Class 对象,不会再去读取磁盘。
  • 除非重启 JVM 或换 ClassLoader,否则无法重新加载或更新类。

5. 动态新增任务结论

  • 未加载过的 class → 可以直接被加载,无需重启(前提:目录在 classpath 中)。
  • 已加载过的 class → 无法重新加载,修改文件无效。

6. 核心一句话总结

类加载是懒加载的,未加载类可以动态加载,已加载类永久驻内存;JVM 不会监听目录变化,想热更新已加载类必须换 ClassLoader 或重启 JVM。

相关推荐
lee_curry7 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
九转成圣8 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
SmartRadio8 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
laowangpython8 小时前
Rust 入门:GitHub 热门内存安全编程语言
开发语言·其他·rust·github
我叫汪枫8 小时前
在后台管理系统中,如何递归和选择保留的思路来过滤菜单
开发语言·javascript·node.js·ecmascript
_.Switch8 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
软件技术NINI8 小时前
webkit简介及工作流程
开发语言·前端·javascript·udp·ecmascript·webkit·yarn
Brendan_0018 小时前
JavaScript的Stomp.over
开发语言·javascript·ecmascript
念2348 小时前
f5 shape分析
开发语言·javascript·ecmascript
苍穹之跃8 小时前
某量JS逆向
开发语言·javascript·ecmascript