在“JVM的classLoader体系-1”,总结了jvm的classloader一些基本的内容,肯定有很多不足的地方,还请大家指点,现在对jvm类加载机制进行一下测试:
1.建立测试文件Main.java和Test.java
Main.java:(负责打印出Main.java和Test.java的类加载器)
public class Main {
public static void main(String args[]){
System.out.print("Main's classLoader is ");
System.out.println(Main.class.getClassLoader());
System.out.print("Test's classLoader is ");
System.out.print(Test.class.getClassLoader());
}
}
Test.java(do nothing):
public class Test {
}
2.测试准备
在F盘下面建立一个javasource的文件夹,并将此文件夹加到CLASSPATH的value中,运行结果如下:
Main's
classLoader is
sun.misc.Launcher$AppClassLoader@19821f(Main.class的加载器)
Test's
classLoader is
sun.misc.Launcher$AppClassLoader@19821f(Test.class的加载器)
3.classLoader加载机制的测试:
3.1测试01-文件存放的位置
•Javasource目录下:
ØMain.class
ØTest.class
•Jdk\jre\ib\ext\classes目录下:
ØMain.class
ØTest.class
•Jdk\jre\classes目录下:
ØMain.class
ØTest.class
3.2测试01-结果
•Main's
classLoader is null
•Test's
classLoader is null
3.3测试01-结果分析
在运行java Main的时候,由Application ClassLoader加载所需要的类,在加载的过程中,Application ClassLoader首先将加载任务委派给其父类Extended ClassLoader,Extended ClassLoader又将加载的任务委派给Bootstrap ClassLoader,由于在Bootstrap ClassLoader下面有Main.class文件,所以BootStrap ClassLoader负责类Main的加载。在Main.class中,引用了Test.class,在默认的情况下,由加载Main.class的类加载器加载Test.class,所以Test.class的类加载器也是null
3.2测试02-文件存放的位置
•Javasource目录下:
ØMain.class
ØTest.class
•Jdk\jre\ib\ext\classes目录下:
ØMain.class
ØTest.class
•Jdk\jre\classes目录下:
ØMain.class
3.2测试02-测试结果
•Main's
classLoader is null
•Test's
classLoader is Exception in thread
"main" java.lang.NoClassDefFoundError:
Test at Main.main(Main.java:8)
3.2测试02-测试结果分析
由于Bootstrap ClassLoader下面有Main.class,所以由Bootstrap ClassLoader负责加载Main.class,在默认的情况下,Main.class所引用的类将由Bootstrap加载,由于Bootstrap所加载的目录下的Test.class被删除了,所以出来NoClassDefFoundError的现象
3.3测试03-文件存放的位置
•Javasource目录下:
ØMain.class
ØTest.class
•Jdk\jre\ib\ext\classes目录下:
ØMain.class
ØTest.class
•Jdk\jre\classes目录下:
ØTest.class
3.3测试03-测试结果
•Main's
classLoader is
sun.misc.Launcher$ExtClassLoader@126b249
•Test's
classLoader is null
3.3测试03-测试结果分析
Main.class由ExtClassLoader加载,在默认的情况下,Test.class也应该由ExtClassLoader加载,ExtClassLoader首先委派其父类Bootstrap
ClassLoader加载,由于Bootstrap所加载文件下有Test.class,所以由Bootstrap负责加载Test.class
3.4测试04-文件存放的位置
•Javasource目录下:
ØMain.class
ØTest.class
•Jdk\jre\ib\ext\classes目录下:
ØMain.class
ØTest.class
•Jdk\jre\classes目录下:
3.4测试04-测试结果
•Main's
classLoader is
sun.misc.Launcher$ExtClassLoader@182f0db
•Test's
classLoader is
sun.misc.Launcher$ExtClassLoader@182f0db
3.4测试04-测试结果分析
思路如测试01
3.5测试05-文件存放的位置
•Javasource目录下:
ØMain.class
ØTest.class
•Jdk\jre\ib\ext\classes目录下:
ØMain.class
•Jdk\jre\classes目录下:
3.5测试05-测试结果
Main's
classLoader is
sun.misc.Launcher$ExtClassLoader@126b249
Test's
classLoader is Exception in thread
"main" java.lang.NoClassDefFoundError:
Test
at Main.main(Main.java:8)
Caused by: java.lang.ClassNotFoundException: Test
at
java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 1 more
3.5测试05-测试结果分析
思路如测试02
3.6测试06-文件存放的位置
•Javasource目录下:
ØMain.class
ØTest.class
•Jdk\jre\ib\ext\classes目录下:
ØTest.class
•Jdk\jre\classes目录下:
3.6测试06-测试结果
•Main's
classLoader is
sun.misc.Launcher$AppClassLoader@ad3ba4
•Test's
classLoader is
sun.misc.Launcher$ExtClassLoader@126b249
3.6测试06-测试结果分析
思路如测试03
4.总结
1.从测试结果中可以看出,类加载器在加载应用程序的class文件时,首先委托其父类进行加载,在父类加载失败的情况下,从由自己去加载。
2.在默认情况下,类A引用类B,那么类B的加载由类A的加载器或者类A加载器的父类来完成
分享到:
相关推荐
2. jps:用于显示在本地或远程主机上由JVM启动的Java应用程序进程的标识符和状态。它类似于Unix/Linux系统中的ps命令。 3. jinfo:这个工具可以查看和修改JVM启动参数。jinfo可以连接到正在运行的Java进程或核心...
Java的类加载器(ClassLoader)体系结构是JVM(Java虚拟机)中至关重要的一部分,它负责将类的字节码转换为运行时的类实例。本文将深入探讨启动类加载器、扩展类加载器、系统类加载器以及用户自定义类加载器,同时还...
1. **类加载器(ClassLoader)**:负责查找和加载类文件到JVM。它遵循双亲委托模型,确保类的唯一性。 2. **运行时数据区(Runtime Data Area)**:包括堆内存、方法区、虚拟机栈、本地方法栈和程序计数器。堆内存...
- **类装载器(Class Loader)**:负责加载.class文件到JVM内存中,分为Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。 - **运行时数据区(Runtime Data Areas)**: - **方法区(Method Area...
二、ClassLoader的体系结构 ClassLoader形成一个树状结构,BootstrapClassLoader是根节点,ExtensionClassLoader是其子节点,SystemClassLoader是ExtensionClassLoader的子节点。用户还可以自定义ClassLoader,插入...
#### 二、JVM体系结构概览 JVM启动后,在操作系统层面表现为一个独立的进程,其内部架构包括以下几个关键组成部分: ##### 2.1 类装载器(ClassLoader) 类装载器负责加载Java类文件(.class文件)。这些文件包含...
在Java编程语言中,`ClassLoader`是一个非常重要的组件,它负责加载程序运行所需的类文件到Java虚拟机(JVM)中。`ClassLoader`不仅管理着类的加载过程,而且其设计模式还对Java的安全性和性能有着至关重要的影响。 #...
JVM提供了三种类加载器:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader,分别用于加载Java核心类库、扩展类库和应用程序类库。此外,JVM还支持自定义类加载器,以便于实现特定的加载逻辑...
类加载器的体系结构包括以下几个重要的组成部分: - **启动类加载器**(Bootstrap ClassLoader): 这个类加载器用于加载 Java 的核心类库,如 java.lang.* 下的类。它是由本地代码实现的,并且并不继承自 `java....
#### 二、Tomcat的ClassLoader体系结构 Tomcat采用了独特的类加载机制来处理不同的类库加载需求。其ClassLoader体系结构可以分为以下几个层次: 1. **Bootstrap ClassLoader**:这是JVM自带的类加载器,负责加载...
Java 类加载器是Java虚拟机(JVM)的关键组成部分,它负责查找并加载类到内存中,以便程序能够执行相关的操作。在这个“classloader-example”博客帖子中,我们将深入探讨类加载器的工作原理,以及如何在运行时实现...
2. **类加载机制**:JVM使用类加载器(ClassLoader)将.class文件加载到内存中,类加载器体系结构包括Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader,它们分别负责加载不同的类库。...
- **基于栈的体系结构**:JVM是基于栈的体系结构,通过操作数栈来执行字节码指令。 - **栈帧**:代表了一个方法的一次调用,包含局部变量区和操作数栈。局部变量区用于存储局部变量和方法参数;操作数栈用于存放...
2. 运行时数据区:包括方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)、程序计数器(PC Register)和堆(Heap)。每个线程有自己的虚拟机栈和程序计数器,而方法区和堆则是所有...
#### 二、JVM的体系结构 JVM主要由以下几部分构成: 1. **类装载器(ClassLoader)**:负责加载.class文件; 2. **执行引擎**:执行字节码或调用本地方法; 3. **运行时数据区**:包括方法区、堆、栈、PC寄存器、...
2. **加载**:使用类加载器(ClassLoader)加载字节码到JVM。 3. **执行**:JVM解释执行字节码,可能还会涉及即时编译(JIT)以提高性能。 #### 1.3、加载.class文件的方式 Java程序可以通过以下几种方式加载....
JVM 的内部体系结构分为三部分:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。 类装载器 1. 启动类装载器:JVM 实现的一部分,负责装载系统类。 2. 用户自定义类装载器:Java 程序的一部分,必须是 ...
2. **扩展类加载器(Extension ClassLoader)**:负责加载Java的扩展类库(位于JRE/lib/ext/目录下的所有jar包),可以通过 `sun.misc.Launcher#getExtClassLoader()` 获取。 3. **应用程序类加载器(Application ...