`
kylinsoong
  • 浏览: 239621 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm classloader

    博客分类:
  • JAVA
阅读更多

1. 从一个简单小实验开始:

(1) Eclipse下建一简单Java project,写一个简单程序,如下:

package com.javaeye.loader;

public class URLClassLoaderTest {
	public void show() {
		System.out.println("I am running...");
	}
}

 

(2) 到项目对应bin/com/javaeye/loader下找到URLClassLoaderTest.class文件,将此文件保存,然后删除整个project;

(3) 在磁盘任何位置建立文件夹com,在com里建立javaeye,在javaeye里建立loader,我建在C盘java目录下,建立完成后将(2)中保存的URLClassLoaderTest.class文件拷贝到其中,如下:



(4) 在非本地Apache Server上任何位置建立文件夹com,在com里建立javaeye,在javaeye里建立loader文件夹,完成后将(2)中保存的URLClassLoaderTest.class文件拷贝到其中,我的非本地计算机IP为192.168.66.250,系统为Linux Redhat, 建立完成后我们可以访问如下图:



 (5) 给出两端端测试代码:

 

                @Test
	public void testInWeb() throws Exception{
		URL[] urls = new URL[]{new URL("http://192.168.66.250/root/java/")};
		URLClassLoader loader = new URLClassLoader(urls);
		Class clas = loader.loadClass("com.javaeye.loader.URLClassLoaderTest");
		Method m = clas.getMethods()[0];
		Object o = clas.newInstance();
		m.invoke(o);
	}
	@Test
	public void testInFileSystem() throws Exception{
		URL[] urls = new URL[]{new URL("file:/C:/java/")};
		URLClassLoader loader = new URLClassLoader(urls);
		Class clas = loader.loadClass("com.javaeye.loader.URLClassLoaderTest");
		Method m = clas.getMethods()[0];
		Object o = clas.newInstance();
		m.invoke(o);
	}

 分别运行两端代码他们输出结果都是:

I am running...

 分析:

      为什么会出现上述运行结果,很明显是因为com.learn.loader.URLClassLoaderTest对象被加载到内存,此对象中的show方法被执行;

思考:

      Java 语言由于在 Java 虚拟机 (JVM) 上运行而显得与众不同,之所以与众不同是因为Java中已编译的程序是一种特殊的、独立于平台的格式,并非依赖于它们所运行的机器。在很大程度上,这种格式不同于传统的可执行程序格式。与 C 或 C++ 编写的程序不同,Java 程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个 Java 类。此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存。ClassLoader 是 JVM 中将类装入内存的工具。

 

2.jvm classLoader architecture

同样给出一个例子代码:

public void testClassLoader2() throws Exception{
		URL[] urls = new URL[]{new URL("http://192.168.66.250/root/java/")};
		URLClassLoader loader = new URLClassLoader(urls);
		System.out.println(loader.getClass());
		System.out.println(loader.getParent().getClass());
		System.out.println(loader.getParent().getParent().getClass());
		System.out.println(loader.getParent().getParent().getParent());
	}

 

运行结果如下:

class java.net.URLClassLoader
class sun.misc.Launcher$AppClassLoader
class sun.misc.Launcher$ExtClassLoader
null

 

要解释这个运行结果需要说明jvm classloader 结构,如下图:



 如图所示,为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 " 双亲委派的加载链 " 结构,图中分为四层。和我们上面运行结果是一一对应的

      最底层:User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类) ,在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性。显然java.net.URLClassLoader属于此层;

      AppClassLoader层:System ClassLoader/系统类加载器,主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。java.lang.ClassLoader.getSystemClassLoader()可以得到他,上述sun.misc.Launcher$AppClassLoader属于此层;

      ExtClassloader层:Extension ClassLoader/扩展类加载器,主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作,sun.misc.Launcher$ExtClassLoader属于此层;

      最顶层:Bootstrap ClassLoader/启动类加载器,主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作,为什么对应这层输出为null?是因为Bootstrap是用C++编写的,我们在Java中看不到它,是null;

 

 

  • 大小: 4.1 KB
  • 大小: 23.7 KB
  • 大小: 14.1 KB
分享到:
评论
14 楼 diyunpeng 2012-04-09  
写的可以,父ClassLoader不能加载,交由子ClassLoader的情况多的很吧。

不过网络上Loader应该是由单独的ClassLoader来实现的,参照RMI。

另外,真心想和大家一起交流学习一下。
13 楼 kimmking 2010-11-02  
kylinsoong 写道
kimmking 写道
kylinsoong 写道
sambean 写道
fantasy 写道
gstarwd 写道
" 双亲委派的加载链 " 结构 是什么意思??没讲清楚

子加载器会询问父类加载器是否能加载当前class,直到问完基类,如果他门都不能加载就由自己加载。。说白了就是先委派父亲加载。

什么情况下会出现父类加载器不能加载当前class?

当子类class文件和父类class文件不在同一台JVM时,比如,在你计算机上加载运程计算机上编译好的class文件,类加载器是Local JVM,而当前Class在 运程计算机上

对osgi下bundle的classloader比较感兴趣。

osgi技术就是指Java 动态模块系统,osgi下每个bundle相当于一个独立的动态模块,可以理解为一个JVM,所以不同bundle之间classloader是完全独立的。只是个人理解

1、不是一个bundle一个jvm
2、classloader也是不是完全独立
12 楼 kylinsoong 2010-11-02  
kimmking 写道
kylinsoong 写道
sambean 写道
fantasy 写道
gstarwd 写道
" 双亲委派的加载链 " 结构 是什么意思??没讲清楚

子加载器会询问父类加载器是否能加载当前class,直到问完基类,如果他门都不能加载就由自己加载。。说白了就是先委派父亲加载。

什么情况下会出现父类加载器不能加载当前class?

当子类class文件和父类class文件不在同一台JVM时,比如,在你计算机上加载运程计算机上编译好的class文件,类加载器是Local JVM,而当前Class在 运程计算机上

对osgi下bundle的classloader比较感兴趣。

osgi技术就是指Java 动态模块系统,osgi下每个bundle相当于一个独立的动态模块,可以理解为一个JVM,所以不同bundle之间classloader是完全独立的。只是个人理解
11 楼 kimmking 2010-11-02  
kylinsoong 写道
sambean 写道
fantasy 写道
gstarwd 写道
" 双亲委派的加载链 " 结构 是什么意思??没讲清楚

子加载器会询问父类加载器是否能加载当前class,直到问完基类,如果他门都不能加载就由自己加载。。说白了就是先委派父亲加载。

什么情况下会出现父类加载器不能加载当前class?

当子类class文件和父类class文件不在同一台JVM时,比如,在你计算机上加载运程计算机上编译好的class文件,类加载器是Local JVM,而当前Class在 运程计算机上

对osgi下bundle的classloader比较感兴趣。
10 楼 kylinsoong 2010-11-02  
sambean 写道
fantasy 写道
gstarwd 写道
" 双亲委派的加载链 " 结构 是什么意思??没讲清楚

子加载器会询问父类加载器是否能加载当前class,直到问完基类,如果他门都不能加载就由自己加载。。说白了就是先委派父亲加载。

什么情况下会出现父类加载器不能加载当前class?

当子类class文件和父类class文件不在同一台JVM时,比如,在你计算机上加载运程计算机上编译好的class文件,类加载器是Local JVM,而当前Class在 运程计算机上
9 楼 sambean 2010-11-02  
fantasy 写道
gstarwd 写道
" 双亲委派的加载链 " 结构 是什么意思??没讲清楚

子加载器会询问父类加载器是否能加载当前class,直到问完基类,如果他门都不能加载就由自己加载。。说白了就是先委派父亲加载。

什么情况下会出现父类加载器不能加载当前class?
8 楼 fantasy 2010-10-26  
gstarwd 写道
" 双亲委派的加载链 " 结构 是什么意思??没讲清楚

子加载器会询问父类加载器是否能加载当前class,直到问完基类,如果他门都不能加载就由自己加载。。说白了就是先委派父亲加载。
7 楼 gstarwd 2010-09-04  
" 双亲委派的加载链 " 结构 是什么意思??没讲清楚
6 楼 xieyongwei 2010-09-03  
引用
为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 " 双亲委派的加载链 " 结构
双亲委派?
5 楼 kylinsoong 2010-09-03  
congdepeng 写道
有个问题啊 ?????

你的class的# package com.learn.loader

那么 loadClass("[color=red]
com.javaeye.loader
[/color].URLClassLoaderTest");
不需要对应的是 loadClass("com.learn.loader.URLClassLoaderTest");吗???

之前做实验URLClassLoaderTest是在
com.javaeye.loader
里,因为只需要URLClassLoaderTest.class,所以之前写的类删掉了,后来写博客时为了还远之前代码所以重写了一下,所以出现逆上述描述,现已经修改...
4 楼 congdepeng 2010-09-03  
有个问题啊 ?????

你的class的# package com.learn.loader

那么 loadClass("com.javaeye.loader.URLClassLoaderTest");
不需要对应的是 loadClass("com.learn.loader.URLClassLoaderTest");吗???
3 楼 seven_cuit 2010-09-03  
路过复习一下
2 楼 bugmenot 2010-09-03  
楼主大大文章的后半段好像跟另一位大大写的一样呀,重温java之classloader体系结构(含hotswap)
1 楼 jeff.key 2010-09-02  
这文章不错,解答了我不少疑问。
我之前一直没有把javase的classloader
分成三~四个层次来看,
现在这样一解释,这个层次就分明多了,
对于以前没有留意到的jvm参数也明白多了。

thanks LZ very much by 1000 times.
je竟不能用中文写上面的这段东西,哈哈,笑死我了

相关推荐

    JVM ClassLoader简析

    ClassLoader是JVM中的一个重要组件,它的主要任务是加载类的二进制数据,转换为Class对象,并供Java应用程序使用。本文将深入浅出地探讨JVM ClassLoader的工作原理和相关知识点。 首先,ClassLoader可以分为三种...

    JVM.zip_JVM代理_classloader

    而JVM代理(JVM Agent)和类加载器(ClassLoader)则是两个关键的概念,它们对于深入理解Java应用程序的运行机制至关重要。 **JVM代理** JVM代理是一种在JVM启动时或者运行时插入额外功能的方式,它允许开发者在不...

    JAVA笔试总结 -- 非常全面

    native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...

    Apache Karaf调研文档

    OSGi 最重要的特性是在 Java 中 ClassLoader 是非常重要的概念,而大家也知道,JVM 本身在ClassLoader 上并没有提供非常强大的功能,比如模块开发非常重要的模块隔离 ClassLoader 的机制、版本加载机制等。...

    探索JVM底层奥秘ClassLoader源码分析与案例讲解

    在JVM的运行机制中,ClassLoader起着至关重要的作用。ClassLoader负责查找并加载类到JVM中,使得程序得以运行。本篇将深入探讨ClassLoader的源码,通过实例解析其工作原理。 ClassLoader的基本工作流程可以概括为...

    Java基础知识点 - 内容比较全面

    5. **JVM ClassLoader机制**:ClassLoader负责加载类到JVM中,包括Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。类加载遵循双亲委派模型,确保类加载的唯一性。 6. **Java中的synchronized使用...

    深入理解ClassLoader工作机制.docx

    Java虚拟机(JVM)中的ClassLoader是负责加载类到内存中的核心组件。它不仅承担着将字节码转换为可执行对象的重任,还参与了类生命周期的各个阶段,包括加载、验证、准备、解析、初始化、使用和卸载。这些阶段共同...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    1. JVM原理:JVM的工作原理涉及类加载器(ClassLoader)、类文件(ClassFile)、内存管理及垃圾收集机制。类加载器负责将.class文件加载到内存中,为程序的运行准备数据结构。内存管理涉及JVM内存区域,包括堆、栈、...

    classloader

    通过创建自定义ClassLoader,你可以定制JVM,使类文件的引入方式完全重新定义,这提供了很多实用和有趣的可能。这篇教程将对Java ClassLoader进行概述,并指导你构建一个示例ClassLoader,该ClassLoader可以自动编译...

    Understanding the Java ClassLoader

    为了更好地理解和利用Java的这一特性,本篇将详细介绍Java ClassLoader的作用及其工作原理,并通过构建一个示例ClassLoader来帮助读者深入理解如何自定义ClassLoader,从而扩展JVM的功能。 #### 二、ClassLoader...

    软件工程师面试题.pdf

    - JVM ClassLoader:Java虚拟机的类加载器,用于加载Java类。 4. Java网络编程 - Java Servlet中的request和response对象处理:它们是HTTP通信中客户端请求和服务器响应的抽象。 - HTTP协议相关概念:如请求方法...

    JVM必知必会

    - **Bootstrap ClassLoader**:JVM级别的类加载器,负责加载`$JAVA_HOME/jre/lib`下的所有类库,不由Java实现,开发者无法直接操作。 - **Extension ClassLoader**:负责加载Java平台扩展功能的jar包,如`%JRE_HOME/...

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

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    ClassLoader小例子

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。本示例"ClassLoader小例子"将深入探讨这个概念,并通过一个具体的程序来演示其工作原理。下面我们...

    狂神说JVM探究.rar

    【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...

    理解Java ClassLoader机制

    Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...

    ClassLoader 详解.doc

    Bootstrap ClassLoader并非继承自java.lang.ClassLoader,而是由JVM直接实现,因此在Java代码中无法直接获取和操作。它加载的类库路径可以通过-Xbootclasspath或-Dsun.boot.class.path系统属性进行设置。 2. ...

Global site tag (gtag.js) - Google Analytics