`

类加载机制转载

    博客分类:
  • java
阅读更多

Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
    这四个类加载器分别为:Bootstrap ClassLoaderExtension ClassLoaderAppClassLoader
URLClassLoader,他们的作用其实从名字就可以大概推测出来了。其中AppClassLoader在很多地方被叫做System ClassLoader

Bootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C++编写的,它用来加载核心类库,在JVM源代码中这样写道:
static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";
Extension ClassLoader是用来加载扩展类,即/lib/ext中的类。
AppClassLoader用来加载Classpath的类,是和我们关系最密切的类。
URLClassLoader用来加载网络上远程的类,暂且不讨论。

它们之间的关系:

1.Parent-Child,按顺序从大到小。不是简单的继承关系。

2.ClassLoader有个getParent的方法,但是Ext ClassLoader调用后得到的是null,bootstrap是JVM自己的,用户看不到。

3.classloader的委托机制:当等级比较低的ClassLoader要加载某个类的时候,它首先会请求Parent加载器来加载,Parent再请求它的Parent
比如现在Ext要加载了,它往上请求。如果最大的Bootstrap找不到,那么Boot会叫Ext自己找找,Ext找不到,是不会让下一级的App去找的,此时就报出ClassNotFoundException

4.类A调用类B,B会要求调用它的类的类加载器来加载它,也就是B会要求加载A的加载器来加载B。这就会有个问题,如果他们在一起,那没关系,肯定某个classloader会把它们俩都加载好。但是如果A在/lib/ext文件夹中,而B在Classpath中呢?过程是这样的首先加载A,那么一层层上到Bootstrap Classloader,boot没找到所以ext自己找,找到了,没问题;加载B,因为A调用了B,所以也从bootstrap来找,没找到,然后A的ext classloader来找还是没找到,但是再也不会往下调用了,于是报出ClassNotFoundException。
但是现实生活中有很多应用,比如JDBC核心方法在核心库而驱动在扩展库,是必定在两个地方的,那怎么办呢?要用到Context ClassLoader我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.

 

 

 

 

ClassLoader的工作原理

每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类
可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为

ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入

 

 

 

 

 

分享到:
评论
2 楼 ma 2011-07-23  
感谢楼主,学习了
1 楼 haiyupeter 2010-01-21  
还不错,同时建议看《深入java虚拟机》一书,非常不错。你博客里写了挺多这些底层的东东,挺不错的。

相关推荐

    转载:Android实现异步加载图片 ListView

    9. **缓存策略**: 图片加载库通常具有智能缓存机制,将图片存储在内存和磁盘中,下次加载时可以从缓存中快速获取,减少网络请求。 10. **网络请求**: 使用异步加载图片时,通常需要进行网络请求。Android提供了...

    《JVM从入门到入魔》笔记.pdf

    1:JVM内存模型:类加载机制【转载、验证、准备、解析、初始化】+类装载器【装载器分类、加载原则】+运行时数据区【方法区、堆、虚拟机栈、本地方法栈、程序计数器】。 2:垃圾回收:垃圾确定【引用计数法、可达性分析...

    [转载]hotspot源码(JDK7)

    5. **类加载机制** Hotspot遵循双亲委托模型进行类加载,从Bootstrap ClassLoader开始,逐级向下查找,直到找到对应的类。这个过程涉及类的加载、验证、准备、解析和初始化。 6. **编译优化技术** Hotspot采用...

    java编程事项(转载收集整理版)

    11. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)以及JVM调优,有助于提升程序性能。 12. **Java 8及以后的特性**:从Java 8开始,引入了Lambda表达式、Stream API和...

    转载osgi学习,开发框架

    6. **资源管理**:通过高效的资源管理和类加载机制,OSGi可以在有限的硬件资源下运行,这解释了为什么它能在BMW汽车的通信-娱乐系统中表现出色。 Eclipse集成开发环境(IDE)与OSGi有着深厚的联系。Eclipse 3.0开始...

    java编写建议(转载)

    **4.8 类加载机制** - 每个类都应该只被加载一次,以确保资源的有效利用。 - 理解类加载器的工作原理对于优化程序性能至关重要。 **4.9 AWT组件** - Java 1.1 中的AWT组件应当谨慎使用。 - 选择合适的GUI框架,例如...

    java面试资料(转载)

    了解类加载过程,特别是静态块和构造器的执行顺序,可以帮助解决一些复杂的初始化问题。 接下来是继承,这是面向对象编程的核心概念之一。Java支持单一继承,即一个类只能直接继承自一个父类,但可以通过接口实现...

    Java字节码(.class文件)格式详解((转载)

    本文将深入解析Java字节码的格式,帮助你理解其背后的运行机制。 1. **Java字节码结构** Java字节码文件由多个部分组成,包括魔数、版本号、常量池、访问标志、类和父类索引、接口索引集合、字段表集合、方法表...

    hibernate官方入门教程 (转载)

    9. **懒加载和级联操作**: 懒加载允许延迟加载关联的对象,减少内存消耗;级联操作可以在父对象上直接操作子对象,简化编程。 10. **缓存机制**: Hibernate提供了一级缓存(Session级别)和二级缓存...

    坦克大战(转载)

    地图的加载和解析也是游戏启动阶段的重要步骤,开发者可能使用MFC的文件操作类,如CFile和CStdioFile,来读取地图数据。 此外,音效和音乐的集成也是提升游戏体验的关键。MFC虽然不直接支持音频处理,但开发者可以...

    jsr168 portlet(struts2+spring2.5+hibernate3.3)(转载)

    【压缩包子文件的文件名称列表】中的"endorsed"通常与Java的类加载机制有关。在Java中,endorsed目录用于放置那些需要覆盖JDK内置库的第三方类库,例如新版本的JSR规范实现。在部署或运行包含JSR168 portlet的应用时...

    提高php代码质量 36计 转载开源中国社区

    合理规划路径、重构文件加载机制、合理管理调试代码以及确保代码的跨平台兼容性,都是提升PHP项目稳定性、可维护性和效率的关键步骤。希望每位开发者都能从中获益,不断精进自己的技能,创造出更加优秀的软件产品。

    Java基础知识及面试题.pdf

    类的加载过程包括类加载器加载字节码文件到内存、jvm 内存数据区将对象状态放置在堆区、各线程使用的变量放在栈区、类的特征放在方法区,然后进行字节码验证再执行。 7. 类的语法与规范 一个源文件只能有一个 ...

    Dojo 教程 笔记 (转载)

    Dojo的模块和包管理机制允许按需加载,这在优化性能和减小网络传输量方面很有帮助。例如,当你需要使用`dojo.math`模块时,可以通过`dojo.require("dojo.math")`来声明。同样,`dojo.io.*`和`dojo.widget.*`代表了...

    Tomcat 7-9转载资源

    - **Context配置**:定义了一个特定的Web应用程序,包括其根路径、文档基础和类加载器设置。 - **Connector配置**:定义了Tomcat如何监听和响应网络请求,包括端口、协议和线程池配置。 - **Realm配置**:用于用户...

    JAVA面试冲刺—通过代码深入理解JVM—(未完待续)

    深入理解JVM一、什么是JVM二、JAVA的运行机制三、JVM架构图四、类加载器子系统1、类加载器子系统作用2、加载(Loading)3、链接(Linking)3.1 验证 (Verify)3.2 准备(Prepare)3.3 解析(Resolve)3、初始化4、...

    TOMCAT源代码,包括转载得别人的分析

    Tomcat使用自定义的ClassLoader来加载Web应用的类,每个Web应用都有自己的独立ClassLoader,这种设计确保了应用间的类隔离,避免了类冲突。 5. **JNDI服务**: Tomcat提供JNDI(Java Naming and Directory ...

    Java 最常见 200+ 面试题全解析:面试必备.pdf

    19. JVM:涵盖Java虚拟机的内存模型、垃圾回收机制、类加载机制、性能调优等高级概念。 除了上述模块,文章还强调了对于面试题的深入解析和代码案例的提供,这对于面试者理解知识点、整理思路和表达能力的培养是至...

    tab页小插件(转载

    5. **多语言支持**:对于国际化应用,插件可能内置多语言机制,方便切换不同语言环境。 6. **可配置选项**:包括Tab的关闭按钮、动画效果、默认选中项等,可通过配置参数进行设定。 7. **兼容性**:确保在主流...

    grace8.0 主题 for WordPress

    重制seo机制,全面支持网站、分类、标签、文章、页面等自定义标题、自定义描述、自定义关键词。安装新主题后,请重新设置SEO选项 优化右侧栏头像小工具,默认都显示。只有在转载形式时,隐藏。 优化原创、投稿、转载...

Global site tag (gtag.js) - Google Analytics