ClassLoader卸载后Class一定被回收吗?Metaspace类卸载真相曝光

第一章:ClassLoader卸载后Class一定被回收吗?Metaspace类卸载真相曝光

Java 虚拟机中的类卸载机制常被开发者误解,尤其是与 ClassLoader 的生命周期紧密关联。一个类能否被卸载,并不取决于它是否“不再使用”,而是取决于其对应的 ClassLoader 是否可以被回收。只有当 ClassLoader 实例不再被引用,且其所加载的所有类对象也没有外部引用时,JVM 才可能触发类的卸载流程。
类卸载的前提条件
  • 该类所有实例均已被垃圾回收
  • 加载该类的 ClassLoader 已被回收
  • 该类的 java.lang.Class 对象没有被任何地方引用(如反射持有)
满足上述条件后,JVM 在进行 Full GC 时才可能回收该类的元数据信息。在 JDK 8 及以后版本中,这些数据存储在 Metaspace 中,而非永久代。

Metaspace 与类卸载的关系

Metaspace 是本地内存区域,用于存放类的元数据。类卸载后,其占用的 Metaspace 内存会被释放回操作系统或内部内存池,但这一过程并非即时。可通过以下 JVM 参数监控 Metaspace 行为:

# 启用类卸载和 Metaspace 回收
-XX:+CMSClassUnloadingEnabled      # 配合 CMS 收集器使用
-XX:+UseG1GC                       # G1 自动支持类卸载(JDK 8u40+)
-XX:MetaspaceSize=64m              # 初始大小
-XX:MaxMetaspaceSize=256m          # 防止无限增长

验证类卸载的实验方法

通过自定义 ClassLoader 加载类并置空引用,强制 GC 观察 Metaspace 使用变化:

public class DynamicClassLoader extends ClassLoader {
    public Class loadFromBytes(byte[] classData) {
        return defineClass(null, classData, 0, classData.length);
    }
}
// 使用后将 loader = null; 并调用 System.gc();
场景类是否可卸载
系统类加载器加载的类否
自定义 ClassLoader 加载且无引用是(满足条件时)
类卸载是 JVM 优化资源的重要机制,尤其在频繁动态加载类的应用场景(如 OSGi、热部署)中至关重要。理解其实现原理有助于避免 Metaspace 内存溢出问题。

第二章:Metaspace中类卸载的核心条件解析

2.1 类加载器被回收的判定机制与实战验证

JVM 中类加载器能否被回收,取决于其是否满足垃圾回收的可达性条件。当一个类加载器及其所加载的所有类不再被任何活动线程引用时,它才可能被标记为可回收。
判定条件
类加载器回收需同时满足:
  • 该类加载器实例本身不可达;
  • 其加载的类和元数据无外部引用;
  • 对应的 ClassLoader 及其命名空间内所有类均无活跃实例。
实战验证代码

public class ClassLoaderGCDemo {
    public static void main(String[] args) throws Exception {
        while (true) {
            CustomClassLoader loader = new CustomClassLoader();
            Class clazz = loader.loadClass("SampleClass");
            Object instance = clazz.newInstance();
            loader = null; // 断开引用
            System.gc(); // 触发垃圾回收
            Thread.sleep(100);
        }
    }
}
上述代码中,每次循环创建自定义类加载器并加载类后立即断开引用。在适当条件下,该类加载器将在下一次 GC 被回收。配合 JVM 参数 -verbose:class 和 -XX:+TraceClassUnloading 可观察类与类加载器的卸载行为。 类卸载的前提是其对应的类元数据也可被回收,这通常发生在 Full GC 且满足无引用状态时。

2.2 类实例全部被回收的前提分析与内存镜像检测

在Java等具备自动垃圾回收机制的语言中,类实例被全部回收的前提是:无任何强引用指向该实例,且其关联的类加载器可被回收。这意味着不仅对象本身需脱离作用域,其静态变量、监听器、缓存引用也必须释放。
关键前提条件
  • 无强引用链可达(包括全局容器、线程局部变量)
  • 类加载器自身无外部引用
  • 无本地资源绑定(如JNI指针、文件句柄)
内存镜像检测示例
jmap -dump:format=b,file=heap.hprof <pid>
jhat heap.hprof
通过上述命令生成堆转储并分析,可定位未被回收的实例及其引用链。配合MAT工具可直观查看“dominator tree”,识别阻止回收的根引用。
图示:对象可达性分析流程 —— 从GC Roots出发,遍历引用图,未被标记的对象将被判定为可回收。

2.3 类元数据引用链排查:GC Roots 的追踪实践

在 JVM 垃圾回收机制中,类元数据的生命周期由 GC Roots 引用链决定。当类加载器不再被引用时,其关联的类元数据才可能被卸载。追踪这一过程需从 GC Roots 出发,逐层分析引用路径。
关键 GC Roots 类型
  • 虚拟机栈中的局部变量
  • 本地方法栈中的 JNI 引用
  • 方法区中的静态字段
  • 活跃线程对象
引用链分析示例

// 示例代码:静态字段持有类实例
public class CacheHolder {
    public static Object cache = new byte[1024 * 1024]; // 可能阻止类卸载
}
上述代码中,cache 作为方法区的静态字段,构成 GC Roots 引用链的一部分。若该字段长期持有对象引用,将导致类加载器无法回收,进而引发元空间内存泄漏。
排查工具建议
使用 jmap -dump 生成堆转储文件,配合 MAT 工具分析类加载器的支配树(Dominator Tree),可精准定位强引用来源。

2.4 匿名类与动态代理对类卸载的影响实验

在 JVM 类卸载机制中,匿名类和动态代理生成的类可能阻碍类加载器的回收,进而影响类的卸载。这类类由运行时动态生成,通常通过 `sun.misc.Unsafe` 或字节码库(如 ASM、CGLIB)实现。
动态代理示例代码
Object proxy = Proxy.newProxyInstance(
    getClass().getClassLoader(),
    new Class[]{Runnable.class},
    (proxy, method, args) -> {
        System.out.println("方法调用: " + method.getName());
        return null;
    }
);
该代码创建了一个实现 Runnable 的代理实例。每次调用会生成新的代理类 $ProxyN,这些类由系统类加载器加载并缓存。
对类卸载的影响分析
  • 匿名类持有外部类引用,延长其生命周期;
  • 动态代理类默认不被回收,除非对应的类加载器可被回收;
  • 频繁使用可能导致 Metaspace 内存溢出。

2.5 JIT编译优化与类卸载的冲突场景模拟

在Java运行时,JIT编译器会将热点方法编译为本地机器码以提升性能。然而,当类加载器被回收、类被卸载时,已编译的代码若仍被引用,可能引发元空间内存泄漏或执行异常。
冲突触发条件
  • JIT已编译某类的热点方法
  • 该类加载器被置为null且不可达
  • 元空间未及时回收对应类元数据
模拟代码示例

public class JITConflictDemo {
    public static void main(String[] args) throws Exception {
        while (true) {
            ClassLoader cl = new URLClassLoader(
                new URL[]{new File("classes").toURI().toURL()},
                null
            );
            Class clazz = cl.loadClass("DynamicClass");
            Object obj = clazz.newInstance();
            clazz.getMethod("execute").invoke(obj); // 触发JIT编译
            // cl 超出作用域,但JIT代码引用未释放
            Thread.sleep(10);
        }
    }
}
上述代码持续加载类并触发JIT编译,但由于类加载器无法被及时回收,导致元空间中类元数据不断累积,最终引发Metaspace OutOfMemoryError。JIT编译后的本地代码持有对类元数据的强引用,阻碍了类卸载流程。

第三章:触发类卸载的关键时机与JVM行为

3.1 Full GC过程中类卸载的触发路径剖析

在Full GC过程中,类卸载是方法区回收的重要环节,其触发依赖于类的“可卸载性”判断。JVM规定,一个类要被卸载,必须同时满足三个条件:该类所有实例均已被回收、加载该类的ClassLoader已被回收、该类的java.lang.Class对象未被任何地方引用。
类卸载的前提条件
  • 类的实例对象全部被GC回收
  • 定义该类的ClassLoader实例已被回收
  • Class对象无强引用,无法通过反射访问
JVM层面的执行路径
在Full GC期间,HotSpot VM会遍历元数据(Metadata)中的InstanceKlass结构,检查其是否满足回收条件。相关代码逻辑如下:

// hotspot/src/share/vm/gc/serial/markSweep.cpp
void MarkSweep::mark_sweep_phase3() {
  // 清除软引用、弱引用、JNI弱全局引用等
  ReferenceProcessor::process_discovered_references();
  // 触发类卸载检查
  ClassLoaderDataGraph::purge();
}
上述流程中,purge() 方法会清理已无强引用的类元数据。只有当类加载器本身被回收后,其所关联的类元数据才能进入待回收队列,最终由GC线程在Full GC阶段完成空间释放。

3.2 Metaspace空间压力下的类回收策略实测

在JVM运行过程中,Metaspace用于存储类的元数据。当加载大量动态类时,可能触发Metaspace空间压力,进而激活类卸载机制。
实验环境配置
使用以下JVM参数启动应用:

-XX:MaxMetaspaceSize=128m -XX:+PrintGCDetails -XX:+PrintMetaspace
通过限制最大Metaspace空间,模拟高压力场景,观察Full GC时是否触发类卸载。
类卸载触发条件分析
类卸载需满足三个条件:
  • 该类所有实例已被回收
  • 加载该类的ClassLoader已被回收
  • 该类Class对象未被引用
监控指标对比
阶段Metaspace使用量Full GC次数
初始28MB0
动态加载10000类116MB3
卸载后34MB3
结果表明,在ClassLoader回收后,关联类元数据被有效清理,验证了Metaspace回收机制的有效性。

3.3 ClassLoader隔离设计如何影响卸载成功率

ClassLoader的隔离机制是实现模块热插拔的核心,但其设计直接影响类卸载的成功率。当一个模块被卸载时,其关联的ClassLoader需被垃圾回收,否则将导致永久性内存驻留。
隔离策略与引用泄漏
常见的问题源于跨ClassLoader的静态引用或线程持有。若子ClassLoader被父级强引用,或第三方库缓存了来自特定ClassLoader的类,则GC无法回收该实例。
  • 避免在父ClassLoader中直接引用子类加载的类
  • 清理线程池、定时器、缓存中持有的类实例
  • 使用弱引用(WeakReference)管理跨域对象引用
典型代码示例

URLClassLoader moduleLoader = new URLClassLoader(urls, parent);
Class clazz = moduleLoader.loadClass("com.example.Module");
Object instance = clazz.newInstance();
// 使用完毕后需显式释放
moduleLoader.close(); // 触发资源清理
moduleLoader = null;  // 建议置空便于GC
上述代码中,调用close()方法会释放JAR文件句柄并中断内部引用链,配合后续置空操作,显著提升ClassLoader被回收的概率。未执行这些步骤则极易造成元空间(Metaspace)溢出。

第四章:诊断与优化类卸载问题的技术手段

4.1 使用jstat与jmap监控Metaspace内存趋势

JVM的Metaspace用于存储类的元数据,随着应用动态加载类的数量增加,Metaspace可能成为内存瓶颈。合理监控其使用趋势对预防OutOfMemoryError至关重要。
jstat实时监控Metaspace
通过`jstat -gc`命令可定期输出Metaspace的使用情况:
jstat -gc 1234 1s
输出字段包括`M`, `MU`(Metaspace容量与已使用量),可用于绘制趋势图。持续上升的`MU`值提示可能存在类加载泄漏。
jmap生成堆外内存快照
结合`jmap`导出详细信息辅助分析:
jmap -clstats 1234
该命令列出所有加载类及其类加载器,帮助识别异常的类加载行为。配合`jstat`周期性采集,可构建完整的Metaspace增长轨迹分析体系。

4.2 利用Eclipse MAT分析类加载器泄漏案例

在Java应用中,类加载器泄漏常导致永久代或元空间内存溢出。通过Eclipse Memory Analyzer(MAT)可精准定位问题根源。
生成堆转储文件
首先,在应用发生内存异常时生成堆转储:
jmap -dump:format=b,file=heap.hprof <pid>
该命令导出指定进程的完整堆内存快照,供MAT离线分析。
使用MAT识别泄漏路径
启动Eclipse MAT并加载堆转储文件后,使用“Leak Suspects”报告自动检测潜在泄漏。若发现类加载器持有大量未释放的Class实例,可通过“dominator tree”查看其支配对象。
对象类型保留大小可能原因
WebAppClassLoader180 MB未注销的监听器或线程
CustomClassLoader95 MB静态缓存引用Class对象
此类问题常见于热部署场景,如应用服务器重复加载新类但旧类加载器无法被回收,最终引发OutOfMemoryError: Metaspace。

4.3 添加-XX:+TraceClassUnloading跟踪类卸载日志

在JVM调优与内存泄漏排查过程中,了解类的加载与卸载行为至关重要。启用类卸载日志可帮助开发者识别未被正确回收的类加载器。
启用类卸载跟踪
通过添加JVM启动参数开启类卸载日志:
-XX:+TraceClassUnloading
该参数会输出每个被卸载的类名及其类加载器信息到标准输出,便于追踪类生命周期。
日志输出示例与分析
启用后,控制台将显示类似以下内容:
Unloading class org/example/TempService$$EnhancerBySpringCGLIB$$12345678
Unloading loader java.net.URLClassLoader @ 0x00aabbcc
上述日志表明指定代理类及其类加载器已被GC回收,常用于验证动态类(如CGLIB、反射生成类)是否正常释放。
配合其他参数使用建议
  • 结合-verbose:class观察类加载全过程
  • 搭配-Xlog:class+unload=debug(适用于JDK11+)获取更详细结构化日志

4.4 Arthas在线诊断工具在类卸载问题中的应用

在排查JVM类卸载问题时,Arthas提供了无需重启应用的实时诊断能力。通过其命令行接口,可深入观察类加载与卸载行为。
定位未卸载的类实例
使用`sc`(search class)命令查看特定类是否仍被加载:
sc -d com.example.LeakClass
该命令输出类的ClassLoader、实例数量及是否可被GC回收。若类长期存在但应被卸载,说明可能存在内存泄漏。
结合gc和classloader命令分析
执行强制GC后观察类状态变化:
  1. 运行 gc 命令触发垃圾回收;
  2. 再次使用 sc 检查目标类是否存在;
  3. 利用 classloader 命令追踪类加载器引用链。
命令作用
sc -d显示类详细信息,包括加载器和实例数
classloader --tree展示类加载器层级关系,辅助判断引用残留

第五章:结语:理解类卸载本质,构建健壮的类加载体系

深入理解类卸载的触发条件
类卸载是 JVM 垃圾回收的一部分,仅当满足以下三个条件时才会发生: 1. 该类所有实例已被回收; 2. 加载该类的 ClassLoader 已被回收; 3. 该类的 java.lang.Class 对象没有在任何地方被引用。 在实际应用中,动态插件系统或热部署场景下需特别关注这些条件。
实战案例:避免因类加载器泄漏导致的内存溢出
某微服务模块使用自定义 ClassLoader 动态加载业务规则脚本,长时间运行后出现 Metaspace OOM。分析发现,缓存中保留了 Class 对象强引用,导致无法卸载:

// 错误示例:使用强引用缓存 Class
private static Map<String, Class<?>> CLASS_CACHE = new HashMap<>();

// 正确做法:使用弱引用
private static Map<String, WeakReference<Class<?>>> CLASS_CACHE = new ConcurrentHashMap<>();
构建可卸载的类加载体系设计原则
  • 避免在系统级静态变量中持有 Class 或 ClassLoader 引用
  • 使用 WeakHashMap 缓存动态加载的类元信息
  • 确保自定义 ClassLoader 可被 GC,不被线程上下文或单例对象长期持有
  • 在 OSGi 或模块化系统中,显式控制模块生命周期
JVM 参数辅助诊断类卸载问题
启用以下参数可监控类卸载行为:

-XX:+TraceClassUnloading
-XX:+PrintGCDetails
-verbose:class
结合 jstat 和 jmap 可定位未卸载类的根因。

相关推荐

达梦数据库集群部署(主备)

达梦数据库集群部署(主备)

m0_71845127的博客 1461

Spring boot的ClasssLoader加载和卸载jar/class

一.前言 在开发过程中,有时候需要动态加载各种jar/class到程序中,然而又只使用一次,或者加载的jar/class中有改动需要持续升级。程序一直在运行,每次加载进去的jar/class如果过多,对系统会造成很大的压力,而且已经加载进去的jar/class不能覆盖,从而造成得不到想要的结果。此时就需要考虑对加载进去的jar/class进行卸载。 二.思路 我们知道,当一个java类...

丶自定义 5417

产品必备技能(十):如何绘制原型图?先要绘制页面流程图+页面原型图!附实操原型图、流程图实例(抖音)

文章目录目标题目实操步骤模板实操【抖音】APP的视频发布功能页面流程绘制页面流程图合格标准绘制页面原型图合格标准 目标 新入行的产品经理都对原型抱有向往的心境,但是有经验的产品经理不会一上来就画原型,而是先画页面流程再来画原型。通过学习,你将学会如何用页面流程图规划用户行为路径、如何借助原型识别问题、减少风险、有效沟通。 题目 任意选择一款你喜欢的产品,体验某个功能,下载并梳理此功能至少5个以上的页面流程跳转点(后面会解释),还原2 - 3个主要界面的低保真原型图。 实操步骤 可使用手绘以及Process

汪雯琦的博客 4842

JVM--02--类加载与卸载

一、加载阶段 1.1 类加载器作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 1.2类加载器分类 JVM支持两种.

na_tion的专栏 2550

别再手动抓波形了!用Synopsys AXI VIP的Port Monitor自动收集事务数据(附完整连接Scoreboard代码)

当标准Port Monitor无法满足需求时,Synopsys提供的callback机制就像一套精密的手术工具,允许你深入VIP内部进行定制化改造。创建自定义监控点的四步法继承基类// 其他自定义字段...endclass重写目标phase方法// 克隆事务并发送到自定义端口在env中注册callbackcustom_cb);连接自定义端口到分析组件经典应用场景地址phase特定检查数据beat级监控自定义性能统计异常注入检测。

weixin_28716181的博客 397

error C2039: “int_least8_t”: 不是“`global namespace'”的成员

在向H.265的测试软件HM16.0中配置boost的时候,发现 include &lt;boost/cstdint.hpp&gt;的时候总是会报错:错误 11 error C2039: “int_fast16_t”: 不是“`global namespace'”的成员 D:\Program Files\Caffe\VSContact\boost_1_58_0\boost\cstdint.hpp ...

flyerene的博客 1万+

Java利用ClassLoader实现类的热加载和卸载

最近做项目的时候遇到这个问题,就是在服务器不重启的情况下实现版本替换,即项目中一部分的类需要实时替换,甚至,对利用动态编译去生成很多临时类; 那就需要解决两个问题: 1.如何实现类的动态替换 2.如何实现类的卸载 当然,关于类的动态编译,我会在今后的文章中写出; 一、实现类的动态替换: 首先,同名同包的类,在静态编译的时候是肯定无法通过的,在运行时也一定不行;这是为什么呢? 因为,所有的类,...

bobozai86的博客 5716

如何实现三种不同RAM?(单端口RAM、伪双端口RAM、真双端口RAM|verilog代码|Testbench|仿真结果)

RAM(随机存取存储器)是计算机系统中的一种主要存储器件,用于存储和读取数据。在RAM中,单端口RAM(Single-port RAM)和双端口RAM(Dual-port RAM)是两种常见的类型,双端口RAM又分为真双端口(True dual-port RAM)和伪双端口RAM(Simple dual-port RAM)。那么什么是单端口和双端口?又该如何区分真双端口和伪双端口?输入只有一组数据线和一组地址线,读写共用地址线,输出只有一个端口。

Loudrs的博客 1万+

深入理解ClassLoader(五)—类的卸载

https://www.cnblogs.com/longshiyVip/p/5174038.html   原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011101413730764/?suggestedreading&amp;wumii 我们知道,当一个类被加载、连接和初始化之后,他的生命周期就开始了,当该类的class...

lppl010_的专栏 4998

如何用 Claude Code 做大型项目重构与架构优化

本文介绍了如何利用Claude Code参与大型项目重构。文章指出,大型项目重构的最大难点在于理解系统结构和控制风险,而非单纯修改代码。作者提出了五步重构法:首先分析项目结构,其次梳理模块依赖关系,然后发现架构问题,接着设计分阶段重构方案,最后逐步实施。重点强调了Claude Code的核心价值在于帮助开发者理解复杂系统、分析模块依赖、发现结构问题、评估改动风险,而非仅作为代码生成工具。文章建议将Claude Code作为架构助手,通过分阶段小范围重构来降低风险,而非一次性全面重构。

sg_knight的专栏 1571

Unreal5从入门到精通之初学者碰到解决不了的问题怎么办?

在学习Unreal的过程中,你曾陷入困境了吗?对于我来说,这种情况发生得比我愿意承认的要多得多。幸运的是,除了一般地在网上搜索之外,还有很多地方可以获得虚幻引擎的帮助。

TxNet 979

使用 URLClassLoader 加载和卸载类

使用 URLClassLoader 加载或卸载类

Engure 1250

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 442

jvm:类的卸载

jvm

amadeus_liu2的博客 563

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

51 java.lang.Class/java.lang.ClassLoader/InstanceKlass/ClassloaderData 的卸载

之前 碰到了一个 flink 基于 ChildFirstClassLoader 来进行任务隔离 导致的内存泄漏的问题然后 使用 demo 复现了一下 问题之后 想探索一下 java language 中 类型的卸载相关并且会 拓展一些其他的知识以下测试用例基于 jdk8, 部分截图基于 jdk9。

970655147的专栏 961

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

10. 类加载与卸载

Override// 从自定义路径加载类字节码// 使用示例Class<?// 触发卸载:置空引用,并触发GCobj = null;// 若满足卸载条件,类会被卸载机制核心要点类加载双亲委派保障安全,三个阶段(加载→链接→初始化)确保类正确加载。类卸载需同时满足实例、Class对象、ClassLoader均被回收,常见于动态加载场景(如OSGi、热部署)。实践意义避免内存泄漏需谨慎管理类加载器生命周期,尤其在模块化、插件化系统中。

sinat_33739100的博客 873

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java 通过代码卸载类

Java 通过代码卸载类:一个初学者的指南 作为一名经验丰富的开发者,我经常被问到一些基础但关键的问题,比如“如何在Java中通过代码卸载类”。这个问题听起来可能有些复杂,但实际上,通过几个简单的步骤,即使是初学者也能轻松掌握。本文将为你提供一个详细的指南,帮助你理解整个过程。 步骤概览 首先,让我们通过一个表格来概览整个...

weixin_26720479的博客 320

Java classLoader那些事儿

1.java类加载的定义&过程 1.定义将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。 2.类加载的过程 3.类编译的过程 4....

程序男的专栏 1060

java热部署和类加载器

参考https://www.cnblogs.com/pfxiong/p/4070462.html https://blog.youkuaiyun.com/u010648555/article/details/78356040 1、热部署是什么? 对于Java应用程序来说,热部署就是在运行时更新Java类文件。 2、热部署有什么用? 可以不重启应用的情况下,更新应用。举个例子,就像电脑可以在不重启的情...

u014203449的博客 1172

利用classloader实现jar包的加载和卸载,实现类的热替换

由于应用局限,一个classloader只加载一个jar包,所以代码为: 这是一个包装类: public class MyClassLoader { @Resource private SystemConfig systemConfig; private final static ConcurrentHashMap&amp;amp;lt;String,MyURLClassLoader...

u011649691的博客 1万+

类加载器与垃圾回收机制

目录索引1.类加载器1.1类生命周期1.2三种类加载器1.3类加载的特性1.3.1类不会重复加载1.3.2双亲委派机制1.3.3沙箱安全机制2.垃圾回收机制2.1概念2.2jvm运行时区方法区堆内存虚拟机栈本地方法栈程序计数器2.3堆内存空间2.4垃圾收集算法2.5垃圾收集器

lk的博客 2269

java 卸载class_Java --ClassLoader创建、加载class、卸载class

一、java提供了三种ClassLoader对Class进行加载:1.BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等,可通过如下程序获得该类加载器从哪些地方加载了相关的jar或class文件:URL[] urls =sun.misc.Launc...

weixin_31049801的博客 1079

python 使用 grpc_gRPC python使用记录

gRPC python使用记录原创happy汪 最后发布于2019-05-29 11:17:44 阅读数 484 收藏展开有了 gRPC, 我们可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑—— gRPC 帮你解决了不同语言及环境间通信的复杂性。使用 protocol buffers...

weixin_39798579的博客 244

java 卸载class_Java Class卸载与ClassLoader

JVM中的Class只有满足以下三个条件,才能被GC回收,也就是该Class被卸载(unload):- 该类所有的实例都已经被GC,也就是JVM中不存在该Class的任何实例。- 加载该类的ClassLoader已经被GC。- 该类的Java.lang.Class 对象没有在任何地方被引用,如不能在任何地方通过反射访问该类的方法jsp和java类是完全不一样的概念。jsp->servlet ...

weixin_33278498的博客 2339

java利用classloader实现热部署

老早之前已经写过几篇classload的文章了,由于我们现在的java 框架里面用到了热部署,所以在回味下吧。先看下之前的文章http://blog.youkuaiyun.com/chaofanwei/article/details/128585231、classloader介绍热部署,即需要jvm释放之前加载的业务class,且重新加载最新的业务class,并释放之前的class(卸载),其实类和普通对象一...

LzwGlory的专栏 1816

Java类加载与卸载

http://blog.youkuaiyun.com/feiyu8607/article/details/8308314 Java Class卸载与ClassLoader 分类: Java2012-12-17 17:02 2047人阅读 评论(0) 收藏 举报 JVM中的Class只有满足以下三个条件,才能被GC回收,也就是该Class被卸载(unload):   

xiangbq的博客 1万+
上一篇: CompletableFuture exceptionally使用陷阱,你踩过几个?
下一篇: 你真的懂MyBatis延迟加载吗?:3个核心触发点大公开
QuickProceed
博客等级 码龄1年 149粉丝 2008原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值