`

java类加载机制概述2

    博客分类:
  • JAVA
 
阅读更多

一 web容器类加载机制

1 tomcat类加载机制

Tomcat中的类加载策略和JDK中的委托模型略有不同。Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的,ClassLoader结构如下:

 

               Bootstrap
                   |
              System
                  |
            Common
          /                \
 Catalina          Shared
                      /  ... ...    \
            webapp1        
webappN

1)Bootstrap ClassLoader: 

负责加载由虚拟机提供的基本运行时类和系统扩展目录($JAVA_HOME/jre/lib/ext)下的JAR包

2)System ClassLoader: 

通常这个加载器用来加载CLASSPATH环境变量中指定的类,但在Tomcat5的标准启动脚本($CATALINA_HOME/bin/catalina.sh或%CATALINA_HOME%/bin/catalina.bat)中改变了它的行为,它只加载下面的类:
$CATALINA_HOME/bin/bootstrap.jar    // 包含 main() 方法来初始化Tomcat 5 server, 包含类加载器实现类. 
$JAVA_HOME/lib/tools.jar // Contains the "javac" compiler used to convert JSP pages into servlet classes. 
$CATALINA_HOME/bin/commons-logging-api.jar // Jakarta commons logging API. 
$CATALINA_HOME/bin/commons-daemon.jar // Jakarta commons daemon API. jmx.jar // The JMX 1.2 implementation.

    3)Common ClassLoader

它负责加载Tomcat本身和所有的web应用都能看到的类。通常,应用的类不应该由他加载

 

$CATALINA_HOME/common/classes,$CATALINA_HOME/commons/endorsed和$CATALINA_HOME/common/lib下的类都由这个加载器加载。缺省的,包括: 
ant.jar - Apache Ant. 
commons-collection.jar  // Jakarta commons collection. 
commons-dbcp.jar // Jakarta commons DBCP, providing a JDBC connection pool to web applications. 
commons-el.jar // Jakarta commons el, implementing the expression language used by Jasper. 
commons-pool.jar // Jakarta commons pool. 
jasper-compiler.jar // The JSP 2.0 compiler. 
jasper-runtime.jar // The JSP 2.0 runtime. 
jsp-api.jar // The JSP 2.0 API. 
naming-common.jar // The JNDI implementation used by Tomcat 5 to represent in-memory naming contexts. 
naming-factory.jar // The JNDI implementation used by Tomcat 5 to resolve references to enterprise resources (EJB, connection pools). 
naming-resources.jar // The specialized JNDI naming context implementation used to represent the static resources of a web application. 
servlet-api.jar // The Servlet and JSP API classes. 
xerces.jar // The XML parser that is visible by default to Tomcat internal classes and to web applications.
xml-apis.jar

    4)Catalina ClassLoader

用来加载实现Tomcat自己需要的类。由它加载的类对web应用都是不可见的。$CATALINA_HOME/server/classes,$CATALINA_HOME/server/lib,都由这个加载器加载

    5)Shared ClassLoader

被所有的web应用共享的类和资源由这个加载器加载。$CATALINA_BASE/shared/classed,$CATALINA_BASE/shared/lib,都由这个加载器加载

    6)WebappXClassLoader

对每个Tomcat里的web应用都创建一个加载器,web应用下的WEB-INF/classes,WEB-INF/lib,都由这个加载器加载,由它所加载的类对其他的web应用是不可见的

 

WebSphere Application Server中的类加载机制

如下是WAS classloader层次
               JVM classloader
                   |
Websphere Extension classloader
                  |
Websphere lib/app classloader
                        |
 Websphere server classloader
                      /  ... ...    \
application classloader1       application classloaderN
1) JVM Classloader
这个层其实就是前面介绍的Java基本的classloader框架,由 bootstrap classloaderextension classloadersystem classloader三个classloader组成,主要是完成jre/lib下,java.ext.dir下,还有JVM classpath下面类的加载。

2)WebSphere Extensions Classloader

这个层的classloader主要完成WAS运行时所需要的类以及相关资源,比如JDBCResource Adapter,以及用户扩展WAS运行时库的目录,这一层的委托策略都是父亲优先(PARENT_FIRST)

3)WebSphere lib/app Class loader

这个层的classloader主要是为了兼容WAS Version 4的。它主要用来加载一些所有应用都共享的类,在Version 4以后,推荐用 Shared libraries来放需要共享的类库
4)WebSphere "server" Class loader
这层的classloader主要是来加载整个运行上当前服务器上的应用程序所共享的的类库,你可以通过定义特定的Shared libraries以来使当前的服务器中的应用程序共享它,,这一层的委托策略是父亲优先(PARENT_FIRST)

5) Application Class loader

 Application Module Class loader主要负责加载应用程序单元
Web Module Class loader应用程序中的Web单元,这时它的父亲就是Application Module Class loader
对于这两个classloader,可以采取的委托策略可以既是父亲优先(PARENT_FIRST),也可以父亲最后(PARENT_LAST)
建议:

1)不要把应用程序依赖的资源放在JVM的系统lib下让JVMclassloader去加载,原因是如果应用程序的委托策略设成PARENT_LAST,可能会造ClassNotFoundException

2)不要修改ws.ext.dirs这个系统属性以此来增加WebSphere Extensions Classloader的加载能力,原因是被扩展的目录可能跟当前已经目录中有冲突,会导致一此不可预期的问题

3)如查开启了动态重加载,这种情况下应用如果有对本地类库的依赖关系,最好使用WebSphere "server" Class loader来加载,这样服务器的整个生命周期这些库都能被应用程序可见,即使应用程序被重新加载

 

二 OSGI类加载机制

1.OSGi中的每个模块(bundle)都包含 Java 包和类。模块可以声明它所依赖的需要导入(import)的其它模块的 Java 包和类(通过 Import-Package),也可以声明导出(export)自己的包和类,供其它模块使用(通过 Export-Package
2.OSGi中的每个模块都有对应的一个类加载器。它负责加载模块自己包含的 Java 包和类。当它需要加载 Java 核心库的类时(以 java 开头的包和类),它会代理给父类加载器(通常是启动类加载器)来完成。当它需要加载所导入的 Java 类时,它会代理给导出此 Java 类的模块来完成加载。模块也可以显式的声明某些 Java 包和类,必须由父类加载器来加载。只需要设置系统属性 org.osgi.framework.bootdelegation的值即可。

 

3.JavaJ2EE的类加载模型都是层次化的,只能委托给上一层类加载器,OSGi类加载模型则是网络图状的,可以在bundle间互相委托(摘自http://kangzye.blog.163.com/blog/static/3681922320105130314194/
 
4. OSGI加载步骤
 

 5.eclipse插件加载
      Eclipse 使用 OSGi 作为插件系统的基础,早期版本的 Eclipse 也设计为插件集合,而且 Eclipse包括自己专用的插件系统来管理交互。但是,随着 Eclipse IDE 要求的增长,必须需要一个更强壮的解决方案。这个新系统的基本要求包括动态添加新插件和停止现有插件的能力。经过大量研究之后,Eclipse 创建者决定通过实现 OSGi 框架规范替换专用的插件框架。eclipse框架如图:


 
 

 

创建基于 Eclipse 的应用程序所需的最小插件集称为 Eclipse Rich Client Platform(RCP)。但是,插件本身不能启动。它们需要在一个环境中启动和操作。Eclipse 使用 OSGi R4 规范的实现提供了该环境。


 
       Platform Runtime 平台运行库是内核,它在启动时检查已安装了哪些插件,并创建关于它们的注册表信息。即在eclipse运行时发现和管理插件。为降低启动时间和资源使用,它在实际需要任何插件时才加载该插件。除了内核外,其他每样东西都是作为插件来实现的。
   eclipse插件关系如图:

----------------------            -------------------- 
|plugin A            |            |plugin B          | 
|   ---------------  | 
contibute  |  --------------  | 
|   | 
ext point p | <--------------- | extension  |  | 
|   ---------------  |_           |  --------------  | 
|         ||         | |          |        ||        | 
|   ---------------  | |implement |  --------------  | 
|   | interface I | <--|------------ | class  C   |  | 
|   ---------------  | |          |  --------------  | 
---------------------- |          ----------/ ------- 
                       |  create, call       | 
                       ----------------------|

 

三 SPI类加载机制

      JDBC API 介面類別(屬於核心類別函式庫)都是由Bootstrap Loader 或是ExtClassLoader 來載入, 可是JDBC driver 常常是藉由ExtClassLoader 或AppClassLoader 來載入,在Java 領域中只要分成API(Interface,公開制定,成为核心函数库)和SPI(特定厂商不同实现)都会有这个问题,解决办法是穿透双亲委托机制。使用线程上下文类加载器。
  • 大小: 96.5 KB
  • 大小: 15.7 KB
  • 大小: 26.5 KB
分享到:
评论

相关推荐

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

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

    java类加载机制.xmind

    该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...

    java类加载器

    在Java中,类加载器(Class Loader)是一项核心机制,用于将字节码(.class文件)加载到JVM中,使其成为运行时的对象。类加载器不仅实现了类的加载功能,还确保了Java程序在多线程环境中的安全性和隔离性。类加载器...

    Java类加载内幕详细讲解

    在Java世界中,类加载机制是一项极为重要的技术。它不仅关乎程序的启动与运行,更是Java动态性与灵活性的基础。本文旨在深入探讨Java类加载的过程、原理及其在实际开发中的应用。 #### 二、类与数据的概念 在Java...

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

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

    Java类加载内幕

    Java 的类加载机制是其核心特性之一,虽然不是经常被提及的热门话题,但对于每一位 Java 开发者来说,掌握这一机制的工作原理至关重要。本文旨在深入剖析 Java 类加载的过程,帮助读者理解类加载的基本概念及其在 ...

    ClassLoader类加载机制和原理详解

    1. 类加载机制概述 Java的类加载机制遵循“双亲委派模型”(Delegation Model)。当一个类被加载时,它首先会尝试由当前线程的Context ClassLoader进行加载,如果该类加载器无法加载,则向上委托给父类加载器,直至...

    Java类动态加载机制在铁路互联网售票中的设计与实现.pdf

    ### Java类动态加载机制在铁路互联网售票中的设计与实现 #### 概述 随着铁路互联网售票系统的广泛应用,其面临着越来越高的并发访问压力。为解决这一问题,系统采用分布式内存数据库集群来存储和处理如余票查询、...

    JVM实战-JVM类加载机制案例分析

    本次实验的主要目的是深入理解Java虚拟机(JVM)中的类加载机制。通过实践操作,掌握类的加载、连接与初始化过程,了解不同类型的类加载器及其工作原理,学会创建自定义的类加载器,并对类的卸载有所认识。实验将结合...

    类的加载机制笔记

    #### 二、类的加载机制概述 类的加载过程主要包括以下几个阶段: 1. **加载(Loading)** 2. **验证(Verification)** 3. **准备(Preparation)** 4. **解析(Resolution)** 5. **初始化(Initialization)** 6...

    使用Java类加载和类路径实现一个简单的在线购物网站.txt

    本文将详细介绍如何利用Java的类加载机制和类路径管理来构建一个简易的在线购物网站。该示例通过实现一个`ShoppingCart`类来管理用户的购物车信息,并提供添加商品、移除商品以及计算总价等功能。此外,我们还将探讨...

    Java反射动态加载实例类

    ### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...

    Java3d加载3D模型的技术

    Java3D加载3D模型的技术 Java3D是一种基于Java的三维图形编程接口,...Java3D加载3D模型的技术是一种基于Java的三维图形编程接口,提供了高效、灵活的加载和显示机制,广泛应用于CAD、CGI、VR、AR、游戏开发等领域。

    java 类加载 。。。反射

    Java 类加载与反射是Java开发中的...总的来说,Java的类加载和反射机制是其动态性和灵活性的关键,理解和掌握这些概念对提升Java编程能力至关重要。在开发过程中,合理利用这些特性可以提高代码的可扩展性和维护性。

    JAVA基础知识概述

    - **安全模型**:通过沙箱安全机制、类加载机制等方式保护运行中的程序不受恶意代码攻击。 #### 二、Java的关键概念与特性 Java具备一系列重要的特性和概念,使得它成为一种非常强大且易于使用的编程语言。 #####...

    Java反射机制概述.zip

    1. **类加载器(Class Loader)**:Java程序中的类并非一开始就全部加载到内存,而是根据需要由类加载器动态加载。这为反射提供了基础。 2. **类对象(Class Object)**:每个类都有一个对应的Class对象,它包含了...

    java面试题--反射机制

    动态加载类是Java反射机制的重要应用场景之一。通过`Class.forName()`方法或者`ClassLoader`的`loadClass()`方法,可以根据类名字符串在运行时加载类。 #### 七、操作成员 - **创建对象**:使用`Class`对象的`new...

    Java基础之Java概述

    - 加载:类加载器将字节码加载到内存中。 - 运行:JVM解释执行字节码。 - 垃圾回收:JVM自动回收不再使用的对象所占用的内存。 #### 五、Java API文档使用 - **API文档**: - 提供了类层次结构、类和接口的...

Global site tag (gtag.js) - Google Analytics