`

JVM---类加载器

 
阅读更多

先来看下classloader的加载代码:public abstract class ClassLoader

 

     //注:如果想改变加载顺序,可将该方法覆盖,像webappclassloader
    protected synchronized Class<?> loadClass(String name, boolean resolve)   
	    throws ClassNotFoundException   
	    {   	    //检查是是否已经加载过   
	    Class c = findLoadedClass(name);   
	    if (c == null) {   
	        try {   
	        if (parent != null) {   
	            //代理给parent去加载类   
	            c = parent.loadClass(name, false);   
	        } else {   
	            //由Bootstrap去加载类   
	            c = findBootstrapClass0(name);   
	        }   
	        } catch (ClassNotFoundException e) {   
	            //parent和Bootstrap都无法加载,则由自定义的方式去加载类   
	            //通过扩展该方法来实现自定义的类加载器   
	            c = findClass(name);   
	        }   
        }  
    protected Class<?> findClass(String name) throws ClassNotFoundException { 
	     throw new ClassNotFoundException(name);//具体加载交给子类实现
    }

 

 

ExtClassLoader与AppClassLoader都是 java.net.URLClassLoader的子类别,您可以在使用java启动程式时,使用以下的指令来指定ExtClassLoader的搜寻路径:
java -Djava.ext.dirs=c:/workspace/ YourClass
可以在使用java启动程式时,使用-classpath或-cp来指定AppClassLoader的搜寻路径,也就是设定Classpath:
java -classpath c:/workspace/ YourClass
ExtClassLoader与AppClassLoader在程式启动后会在虚拟机器中存在一份,您在程式运行过程中就无法再改变它的搜寻路径,如果在程式运行过程中,打算动态决定从其它的路径载入类别,就要产生新的类别载入器。
您可以使用URLClassLoader来产生新的类别载入器,它需要java.net.URL作为其参数来指定类别载入的搜寻路径,例如:
URL url1 = new URL("file:/d:/workspace/");
URLClassLoader urlClassLoader1 =  new URLClassLoader(new URL[] {url1});
Class c1 = urlClassLoader1.loadClass("ClassDemoTest");
在新增了ClassLoader后,您可以使用它的loadClass()方法来指定要载入的类别名称,新增 ClassLoader时,会自动将新增的ClassLoader的parent设定为AppClassLoader,并在每次载入类别时,先委托 parent代为搜寻,所以上例中搜寻ClassDemoTest类别时,会一路往上委托至Bootstrap Loader先开始搜寻,接着是ExtClassLoader、AppClassLoader,如果都找不到,才使用新增的ClassLoader搜寻。
由同一个ClassLoader载入的类别档案,会只有一份Class实例,如果同一个类别档案是由两个不同的ClassLoader载入,则会有两份不同的Class实例,注意这个说法,如果有两个不同的ClassLoader搜寻同一个类别,如果在parent的 AppClassLoader搜寻路径中就可以找到,则Class实例就只会有一个,如果是由各自的ClassLoader搜寻到,则Class的实例会有两份。

分享到:
评论

相关推荐

    jvm-npm, 适用于JVM的兼容CommonJS模块加载器.zip

    jvm-npm, 适用于JVM的兼容CommonJS模块加载器 JVM上Javascript运行时中的NPM模块加载支持。 实现基于 http://nodejs.org/api/modules.html,应该完全兼容。 当然,不包括完整的node.js API,因此不要期望依赖于它的...

    jvm-mon基于控制台的JVM监视

    4. **类加载统计**:显示已加载的类数量,帮助分析类加载是否正常,是否存在过多的类加载导致内存消耗增加。 5. **CPU使用率**:监控JVM的CPU使用情况,过高可能意味着存在性能瓶颈或无用计算。 6. **系统资源监控...

    JAVA-JVM-01类加载机制

    《JAVA-JVM-01类加载机制》 Java虚拟机(JVM)是Java程序运行的基础,其中类加载机制是其核心组成部分。...自定义类加载器则提供了扩展JVM类加载功能的可能,使得开发者能够根据需求加载非标准路径或网络上的类。

    weilei-JVM-ppt.rar

    2. **类加载机制**:探讨类的加载、验证、准备、解析和初始化等阶段,以及双亲委托模型和自定义类加载器的应用。 3. **内存管理**:详细讲解堆内存、栈内存、方法区、程序计数器、本地方法栈等区域的分配与回收,...

    jvm-profiler,jvm分析器向kafka、控制台输出或自定义报告器发送度量.zip

    JVM分析器的主要目标是对JVM的内存使用、CPU消耗、线程活动、类加载情况等进行实时监测,以便于定位性能瓶颈和内存泄漏等问题。在这个项目中,它特别关注了Hadoop和Spark这样的大数据处理框架,这些框架在JVM上运行...

    jvm-demo.zip

    JVM通过类加载器、运行时数据区、执行引擎、本地方法接口和垃圾收集机制等组件协同工作,确保Java程序的高效运行。 2. **类加载机制** JVM的类加载机制包括加载、验证、准备、解析和初始化五个阶段。"jvm-demo...

    JVM实战-JVM类加载机制案例分析

    2. **类加载器及类加载器的委托机制**:JVM中有三种内置的类加载器,分别是启动类加载器、扩展类加载器和应用类加载器。此外,还可以自定义类加载器。类加载器之间遵循委托机制,即下级类加载器先请求上级类加载器...

    jvm调优测试仓库-jvm-monitor.zip

    3. 类加载机制:了解双亲委派模型、类加载器层次以及类加载的生命周期,可以帮助我们优化类的加载和卸载过程。 二、JVM监控工具 "jvm-monitor"是一个用于JVM性能监控的工具,它可以帮助开发者实时查看JVM的各种...

    jvm-full-gc调优-jvm-full-gc.zip

    13. **类加载机制**:理解类加载的双亲委派模型,避免类的不必要加载,可以减轻持久代的压力,从而减少Full GC。 通过上述知识点的学习和实践,开发者可以有效地进行JVM Full GC的调优,提升应用的性能和稳定性。在...

    jvm-sandbox demo

    JVM沙箱基于Java的类加载机制,通过自定义类加载器来实现对代码的动态加载和控制。它拦截并控制类的加载过程,允许在运行时动态地修改类的行为,同时对代码执行进行细粒度的权限控制。 **2. 安装与配置:** 首先,...

    jvm基础知识与调优-jvm-training.zip

    - 类加载器:JVM通过类加载器将.class文件加载到内存,分为引导类加载器、扩展类加载器和应用程序类加载器。 - 方法区:存储已加载的类信息、常量、静态变量等。 - Java堆:所有对象实例都在此分配内存,分为...

    mini-jvm in rust实现jvm,jvm-rs-main.zip

    1. 类加载器:负责加载并解析.class文件,将字节码转换为内存中的数据结构。 2. 字节码解释器:读取类文件中的字节码指令,逐条执行并更新运行时环境。 3. 运行时数据区:模拟JVM的堆、栈、方法区等,存储对象实例和...

    黑马程序员------类加载器学习注意点

    本文将主要围绕“黑马程序员------类加载器学习注意点”展开,探讨一些关键知识点。 首先,我们需要理解类加载器的基本工作原理。在Java中,类加载过程包括加载(Loading)、验证(Verification)、准备...

    jvm-demo1.zip

    - **类加载机制**:理解双亲委派模型,知道如何自定义类加载器,对于解决一些特定场景下的问题很有帮助,例如热部署和模块化系统。 - **线程池配置**:合理的线程池配置可以提高并发性能,避免资源浪费。理解...

    用于测试jvm gc调优-share-jvm-gc.zip

    7. **类加载器管理**:类加载器的不当使用可能导致内存泄漏,因此需要关注类的加载和卸载过程,避免长时间存活的类加载器持有大量不再使用的对象。 8. **代码优化**:避免不必要的大对象创建,减少长生命周期对象,...

    JVM调优的测试项目-JVM-subject.zip

    9. **JVM子系统优化**:包括编译器(JIT编译器优化),类加载器优化,元空间(Metaspace)优化等。 10. **实战经验**:通过实际项目中的调优案例,可以学习如何根据不同的业务场景和性能需求,制定合适的调优策略。...

    理论与实践结合 解密JVM-day02.rar

    JVM主要由类加载器、运行时数据区、执行引擎、本地方法接口和本地库组成。类加载器负责加载类文件,运行时数据区存储程序运行时的数据,执行引擎执行字节码,本地方法接口用于调用非Java语言实现的系统功能,本地库...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    本部分我们将深入探讨JVM中的类加载器,特别是根类加载器、扩展类加载器和系统类加载器。 首先,让我们了解类加载的基本过程。当JVM启动时,会触发类加载。这个过程分为三个阶段:加载、链接和初始化。加载阶段,类...

Global site tag (gtag.js) - Google Analytics