`
songkewei110
  • 浏览: 40514 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JVM的classLoader体系-2

阅读更多

    在“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的文件夹,并将此文件夹加到CLASSPATHvalue中,运行结果如下:

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.classExtClassLoader加载,在默认的情况下,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 楼 songkewei110 2011-04-17  
dingherry 写道
很好的学习方案,by the way,LZ在看什么书呢?深入java虚拟机  吗?

在看“深入java虚拟机”,看的一知半解,慢慢啃吧
1 楼 dingherry 2011-04-17  
很好的学习方案,by the way,LZ在看什么书呢?深入java虚拟机  吗?

相关推荐

    JVM-Tunning-Tools-Introduction

    2. jps:用于显示在本地或远程主机上由JVM启动的Java应用程序进程的标识符和状态。它类似于Unix/Linux系统中的ps命令。 3. jinfo:这个工具可以查看和修改JVM启动参数。jinfo可以连接到正在运行的Java进程或核心...

    classloader体系结构(含hotswap)

    Java的类加载器(ClassLoader)体系结构是JVM(Java虚拟机)中至关重要的一部分,它负责将类的字节码转换为运行时的类实例。本文将深入探讨启动类加载器、扩展类加载器、系统类加载器以及用户自定义类加载器,同时还...

    JVM详解-淘宝内部资料

    1. **类加载器(ClassLoader)**:负责查找和加载类文件到JVM。它遵循双亲委托模型,确保类的唯一性。 2. **运行时数据区(Runtime Data Area)**:包括堆内存、方法区、虚拟机栈、本地方法栈和程序计数器。堆内存...

    JVM体系结构与GC调优

    - **类装载器(Class Loader)**:负责加载.class文件到JVM内存中,分为Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。 - **运行时数据区(Runtime Data Areas)**: - **方法区(Method Area...

    java ClassLoader机制及其在OSGi中的应用

    二、ClassLoader的体系结构 ClassLoader形成一个树状结构,BootstrapClassLoader是根节点,ExtensionClassLoader是其子节点,SystemClassLoader是ExtensionClassLoader的子节点。用户还可以自定义ClassLoader,插入...

    JVM-整体结构原理深度解析

    #### 二、JVM体系结构概览 JVM启动后,在操作系统层面表现为一个独立的进程,其内部架构包括以下几个关键组成部分: ##### 2.1 类装载器(ClassLoader) 类装载器负责加载Java类文件(.class文件)。这些文件包含...

    ClassLoader

    在Java编程语言中,`ClassLoader`是一个非常重要的组件,它负责加载程序运行所需的类文件到Java虚拟机(JVM)中。`ClassLoader`不仅管理着类的加载过程,而且其设计模式还对Java的安全性和性能有着至关重要的影响。 #...

    JVM原理讲解和调优,详细讲解JVM底层

    JVM提供了三种类加载器:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader,分别用于加载Java核心类库、扩展类库和应用程序类库。此外,JVM还支持自定义类加载器,以便于实现特定的加载逻辑...

    2020-review-7-jvm.pptx

    类加载器的体系结构包括以下几个重要的组成部分: - **启动类加载器**(Bootstrap ClassLoader): 这个类加载器用于加载 Java 的核心类库,如 java.lang.* 下的类。它是由本地代码实现的,并且并不继承自 `java....

    Tomcat研究之ClassLoader.pdf

    #### 二、Tomcat的ClassLoader体系结构 Tomcat采用了独特的类加载机制来处理不同的类库加载需求。其ClassLoader体系结构可以分为以下几个层次: 1. **Bootstrap ClassLoader**:这是JVM自带的类加载器,负责加载...

    classloader-example:博客帖子

    Java 类加载器是Java虚拟机(JVM)的关键组成部分,它负责查找并加载类到内存中,以便程序能够执行相关的操作。在这个“classloader-example”博客帖子中,我们将深入探讨类加载器的工作原理,以及如何在运行时实现...

    jvm的基本原理及结构

    2. **类加载机制**:JVM使用类加载器(ClassLoader)将.class文件加载到内存中,类加载器体系结构包括Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader,它们分别负责加载不同的类库。...

    JVM的那些事.pptx

    - **基于栈的体系结构**:JVM是基于栈的体系结构,通过操作数栈来执行字节码指令。 - **栈帧**:代表了一个方法的一次调用,包含局部变量区和操作数栈。局部变量区用于存储局部变量和方法参数;操作数栈用于存放...

    JVM笔记.docx

    2. 运行时数据区:包括方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)、程序计数器(PC Register)和堆(Heap)。每个线程有自己的虚拟机栈和程序计数器,而方法区和堆则是所有...

    jvm原理及调优

    #### 二、JVM的体系结构 JVM主要由以下几部分构成: 1. **类装载器(ClassLoader)**:负责加载.class文件; 2. **执行引擎**:执行字节码或调用本地方法; 3. **运行时数据区**:包括方法区、堆、栈、PC寄存器、...

    深入JVM整理文档

    2. **加载**:使用类加载器(ClassLoader)加载字节码到JVM。 3. **执行**:JVM解释执行字节码,可能还会涉及即时编译(JIT)以提高性能。 #### 1.3、加载.class文件的方式 Java程序可以通过以下几种方式加载....

    JVM的相关概念.doc

    JVM 的内部体系结构分为三部分:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。 类装载器 1. 启动类装载器:JVM 实现的一部分,负责装载系统类。 2. 用户自定义类装载器:Java 程序的一部分,必须是 ...

    jvm 加载class文件

    2. **扩展类加载器(Extension ClassLoader)**:负责加载Java的扩展类库(位于JRE/lib/ext/目录下的所有jar包),可以通过 `sun.misc.Launcher#getExtClassLoader()` 获取。 3. **应用程序类加载器(Application ...

Global site tag (gtag.js) - Google Analytics