先来看下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模块加载器 JVM上Javascript运行时中的NPM模块加载支持。 实现基于 http://nodejs.org/api/modules.html,应该完全兼容。 当然,不包括完整的node.js API,因此不要期望依赖于它的...
4. **类加载统计**:显示已加载的类数量,帮助分析类加载是否正常,是否存在过多的类加载导致内存消耗增加。 5. **CPU使用率**:监控JVM的CPU使用情况,过高可能意味着存在性能瓶颈或无用计算。 6. **系统资源监控...
《JAVA-JVM-01类加载机制》 Java虚拟机(JVM)是Java程序运行的基础,其中类加载机制是其核心组成部分。...自定义类加载器则提供了扩展JVM类加载功能的可能,使得开发者能够根据需求加载非标准路径或网络上的类。
2. **类加载机制**:探讨类的加载、验证、准备、解析和初始化等阶段,以及双亲委托模型和自定义类加载器的应用。 3. **内存管理**:详细讲解堆内存、栈内存、方法区、程序计数器、本地方法栈等区域的分配与回收,...
JVM分析器的主要目标是对JVM的内存使用、CPU消耗、线程活动、类加载情况等进行实时监测,以便于定位性能瓶颈和内存泄漏等问题。在这个项目中,它特别关注了Hadoop和Spark这样的大数据处理框架,这些框架在JVM上运行...
JVM通过类加载器、运行时数据区、执行引擎、本地方法接口和垃圾收集机制等组件协同工作,确保Java程序的高效运行。 2. **类加载机制** JVM的类加载机制包括加载、验证、准备、解析和初始化五个阶段。"jvm-demo...
2. **类加载器及类加载器的委托机制**:JVM中有三种内置的类加载器,分别是启动类加载器、扩展类加载器和应用类加载器。此外,还可以自定义类加载器。类加载器之间遵循委托机制,即下级类加载器先请求上级类加载器...
3. 类加载机制:了解双亲委派模型、类加载器层次以及类加载的生命周期,可以帮助我们优化类的加载和卸载过程。 二、JVM监控工具 "jvm-monitor"是一个用于JVM性能监控的工具,它可以帮助开发者实时查看JVM的各种...
13. **类加载机制**:理解类加载的双亲委派模型,避免类的不必要加载,可以减轻持久代的压力,从而减少Full GC。 通过上述知识点的学习和实践,开发者可以有效地进行JVM Full GC的调优,提升应用的性能和稳定性。在...
JVM沙箱基于Java的类加载机制,通过自定义类加载器来实现对代码的动态加载和控制。它拦截并控制类的加载过程,允许在运行时动态地修改类的行为,同时对代码执行进行细粒度的权限控制。 **2. 安装与配置:** 首先,...
- 类加载器:JVM通过类加载器将.class文件加载到内存,分为引导类加载器、扩展类加载器和应用程序类加载器。 - 方法区:存储已加载的类信息、常量、静态变量等。 - Java堆:所有对象实例都在此分配内存,分为...
1. 类加载器:负责加载并解析.class文件,将字节码转换为内存中的数据结构。 2. 字节码解释器:读取类文件中的字节码指令,逐条执行并更新运行时环境。 3. 运行时数据区:模拟JVM的堆、栈、方法区等,存储对象实例和...
本文将主要围绕“黑马程序员------类加载器学习注意点”展开,探讨一些关键知识点。 首先,我们需要理解类加载器的基本工作原理。在Java中,类加载过程包括加载(Loading)、验证(Verification)、准备...
- **类加载机制**:理解双亲委派模型,知道如何自定义类加载器,对于解决一些特定场景下的问题很有帮助,例如热部署和模块化系统。 - **线程池配置**:合理的线程池配置可以提高并发性能,避免资源浪费。理解...
7. **类加载器管理**:类加载器的不当使用可能导致内存泄漏,因此需要关注类的加载和卸载过程,避免长时间存活的类加载器持有大量不再使用的对象。 8. **代码优化**:避免不必要的大对象创建,减少长生命周期对象,...
9. **JVM子系统优化**:包括编译器(JIT编译器优化),类加载器优化,元空间(Metaspace)优化等。 10. **实战经验**:通过实际项目中的调优案例,可以学习如何根据不同的业务场景和性能需求,制定合适的调优策略。...
JVM主要由类加载器、运行时数据区、执行引擎、本地方法接口和本地库组成。类加载器负责加载类文件,运行时数据区存储程序运行时的数据,执行引擎执行字节码,本地方法接口用于调用非Java语言实现的系统功能,本地库...
本部分我们将深入探讨JVM中的类加载器,特别是根类加载器、扩展类加载器和系统类加载器。 首先,让我们了解类加载的基本过程。当JVM启动时,会触发类加载。这个过程分为三个阶段:加载、链接和初始化。加载阶段,类...