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

类加载机制

 
阅读更多
Tomcat类加载机制
2010年06月24日 星期四 23:27

Tomcat Server在启动的时候将构 一个ClassLoader树,以保证模块的类库是私有的

- Bootstrap - 载入JVM自带的类和/jre/lib/ext/*.jar
- System - 载入/*.class
- Common - 载入/common/...,它们对TOMCAT和所有的WEB APP都可见
- Catalina - 载入/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见
- Shared - 载入/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)
- WebApp - 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见

每个运行中的线程都有一个成员 contextClassLoader,用来在运行时动态地载入其它类,系统默认的 contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的 类、$JAVA_HOME/jre/lib/ext/中的类和/中的类,可以使用Thread.currentThread(). setContextClassLoade(...);更改当前线程的contextClassLoader,来改变其载入类的行为 ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入

二、Websphere类加载机制
Java应用程序运行时,在class执行和被访问之前,它必须通过类加载器加载使之有效,类加载器是JVM代码的一部 分,负责在JVM虚拟机中查找和加载所有的Java 类和本地的lib库。类加载器的不同配置影响到应用程序部署到应用程序服务器上运行时的行为。JVM和WebSphere应用程序服务器提供了多种不同的 类加载器配置,形成一个具有父子关系的分层结构。

如上图所示,WebSphere中类加载器被组织成一个自上而下的层次结构,最上层是系统的运行环境JVM,最下层是具体的应用程序,上下层之间形成父子关系。

JVM Class loader:位于整个层次结构的最上层,它是整个类加载器层次结构的根,因此它没有父类加载器。这个类加载器负责加载JVM类, JVM 扩展类,以及定义在classpath 环境变量上的所有的Java类。
WebSphere Extensions Class loader:WebSphere 扩展类加载器, 它将加载WebSphere的一些runtime 类,资源适配器类等。
WebSphere lib/app Class loader:WebSphere服务器类加载器,它将加载WebSphere安装目录下$(WAS_HOME)/lib/app路径上的类。在WAS v4版本中,WAS使用这个路径在所有的应用程序之间共享jar包。从WAS v5开始,共享库功能提供了一种更好的方式,因此,这个类加载器主要用于一些原有的系统的兼容。
WebSphere "server" Class loader:WebSphere应用服务器类加载器。它定义在这个服务器上的所有的应用程序之间共享的类。WAS v5中有了共享库的概念之后,可以为应用服务器定义多个与共享库相关联的类加载器,他们按照定义的先后顺序形成父子关系。
Application Module Class Loader:应用程序类加载器,位于层次结构的最后一层,用于加载J2EE应用程序。根据应用程序的类加载策略的不同,还可以为Web模块定义自己的类加载器。
关于WebSphere的类加载器的层次结构,以下的几点说明可能更有助于进一步的理解类的查找和加载过程:

每个类加载器负责在自身定义的类路径上进行查找和加载类。
一个子类加载器能够委托它的父类加载器查找和加载类,一个加载类的请求会从子类加载器发送到父类加载器,但是从来不会从父类加载器发送到子类加载器。
一旦一个类被成功加载,JVM 会缓存这个类直至其生命周期结束,并把它和相应的类加载器关联在一起,这意味着不同的类加载器可以加载相同名字的类。
如果一个加载的类依赖于另一个或一些类,那么这些被依赖的类必须存在于这个类的类加载器查找路径上,或者父类加载器查找路径上。
如果一个类加载器以及它所有的父类加载器都无法找到所需的类,系统就会抛出ClassNotFoundExecption异常或者NoClassDefFoundError的错误

类加载器的委托模式

类加载器有一个重要的属性:委托模式(Delegation Mode,有时也称为加载方式:Classloader mode)。委托模式决定了类加载器在查找一个类的时候,是先查找类加载器自身指定的类路径还是先查找父类加载器上的类路径。

类加载器的委托模式有两个取值:

Parent_First:在加载类的时候,在从类加载器自身的类路径上查找加载类之前,首先尝试在父类加载器的类路径上查找和加载类。
Parent_Last:在加载类的时候,首先尝试从自己的类路径上查找加载类,在找不到的情况下,再尝试父类加载器类路径。
有了委托模式的概念,我们可以更加灵活的配置在类加载器的层次结构中类的加载和查找方式。表1中给出了在WebSphere的类加载器层次结构中各个类加载器的委托模式的定义,并给出了不同的类加载器内类的生命周期。

注意:在上表中,"JVM Class loader" 因为在类加载器的最顶层,它没有父类加载器,因此其委托模式为N/A,"WebSphere Extensions Class loader"和"WebSphere lib/app Class loader"的委托模式固定为表中的取值,不可配置,其它的类加载器的委托模式都是可以配置的。

分享到:
评论

相关推荐

    深入研究Java类加载机制 深入研究Java类加载机制

    ### 深入研究Java类加载机制 #### 一、Java类加载机制概述 Java类加载机制是Java程序运行的第一步,它对于理解Java虚拟机(JVM)的行为至关重要。类加载过程涉及到类的加载、链接(验证、准备、解析)、初始化等...

    java类加载机制

    ### Java 类加载机制详解 Java 类加载机制是Java运行时环境的一个核心组成部分,它负责将编译后的Java字节码加载到JVM中,并确保Java应用程序能够正确地运行。类加载机制不仅涉及到类的加载、验证、准备、解析和...

    tomcat 类加载机制 —— ClassLoader

    《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...

    JVM类加载机制详细讲解

    总结,JVM 类加载机制是Java平台的核心特性之一,它确保了程序的稳定运行和动态扩展能力。理解类加载器的工作原理和双亲委派模型对于优化程序性能、解决类冲突以及构建复杂的模块化系统至关重要。在实际开发中,掌握...

    类加载机制及反射

    Java语言的类加载机制是其运行时环境的重要组成部分,它负责将类的字节码文件从磁盘、网络或其他数据源加载到JVM(Java虚拟机)中,并转化为可以执行的Java对象。类加载机制包括加载、验证、准备、解析和初始化五个...

    Android-Android热修复框架基于类加载机制的代码修复

    本篇文章将深入探讨Android热修复框架的工作原理,特别是基于类加载机制的代码修复。 Android热修复的核心在于替换或修补运行时应用中的问题代码,而实现这一目标的关键是类加载器(ClassLoader)。在Java和Android...

    虚拟机类加载机制

    经典的java虚拟机类加载机制 看完后会有醍醐灌顶的感觉

    java注解_反射_字节码_类加载机制.zip

    Java注解、反射、字节码和类加载机制是Java编程中的核心概念,它们在实际开发中扮演着重要角色。让我们深入探讨这些知识点。 **Java注解(Annotation)**: Java注解是一种元数据,它提供了在编译时或运行时处理代码的...

    Java类加载机制与反射-PPT

    Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射

    jvm学习笔记(jvm内存模型&垃圾收集算法&类加载机制)

    在JVM的学习中,理解其内存模型、垃圾收集算法以及类加载机制至关重要。 1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这...

    深入研究Java的类加载机制.pdf

    深入研究Java的类加载机制 Java类加载机制是Java虚拟机的一项核心技术,可以在运行时刻动态地加载或替换系统的某些功能模块,而不影响系统其他功能模块的正常运行。类加载机制是Java虚拟机中的一项重要技术,可以使...

    java类加载机制原理与实现

    Java 类加载机制原理与实现 Java 类加载机制是 Java 虚拟机(JVM)的一部分,负责将编译后的 Java 字节码文件加载到 JVM 中,以便执行 Java 程序。类加载机制是 JVM 的核心组件之一,对 Java 程序的执行和安全性起...

    类加载机制与JDK调优命令.pdf

    类加载机制是Java虚拟机(JVM)在运行Java程序时,负责将编译后的字节码文件加载到内存中并执行的过程。这一过程涉及五个主要步骤:加载、连接、初始化、使用和卸载。首先,类加载器将.class文件加载到内存中;接着...

    Java类加载机制

    ### Java类加载机制详解 #### 一、引言 Java 的类加载机制是 Java 运行时环境(JRE)中的一个重要组成部分。它负责将 Java 类的字节码(.class 文件)加载到 Java 虚拟机(JVM)中,并确保类的正确加载、链接和...

    Java动态类加载机制分析及其应用.pdf

    Java 动态类加载机制分析及其应用 Java 动态类加载机制是 Java 虚拟机(JVM)的一种机制,允许在 Java 应用程序运行期间动态加载类文件,而不影响其他功能模块的正常运行。这种机制可以提高 Java 应用程序的灵活性...

    Java动态类加载机制研究及应用.pdf

    Java 动态类加载机制研究及应用 Java 动态类加载机制研究及应用是基于 Java 虚拟机(JV M)机制的,旨在实现 Java 应用程序中动态加载类文件,而不影响其他功能模块的正常运行。为了实现这个目标,需要对 Java 类...

    Java类加载机制.doc

    Java 类加载机制是Java平台的核心特性之一,它负责将类的字节码加载到Java虚拟机(JVM)中并转换为运行时的类对象。理解这一机制对于优化应用程序性能和解决类相关的错误至关重要。 首先,类加载的过程分为三个主要...

    JAVA 类加载机制分析

    JAVA 类加载机制是Java平台核心特性之一,它关乎到程序的运行时环境和代码的动态加载。理解这一机制有助于开发者解决与对象创建、配置问题、应用程序发布等相关的问题。以下是关于JAVA 类加载机制的详细分析: 首先...

    反射机制和类加载机制学习总结

    类加载机制是指Java虚拟机如何将Java类从文件系统加载到内存中,并准备好让Java程序使用的整个过程。这个过程包括了类的加载、连接和初始化三个阶段。 1. **加载**:找到并加载类的二进制数据。 2. **验证**:确保...

    通过类加载机制动手实现Android热修复

    本文将基于提供的"通过类加载机制动手实现Android热修复"的Demo,深入探讨Android热修复的核心原理以及如何通过类加载机制实现这一过程。 首先,热修复的关键在于对应用的字节码(Dalvik Executable,DEX)进行动态...

Global site tag (gtag.js) - Google Analytics