转载自: https://blog.csdn.net/eric_sunah/article/details/17289985

1.1     什么是ClassLoader

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一   个Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。

基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。下面详细介绍这个 Java 类。

1.2     ClassLoader  的职责

java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class类的一个实例。除此之外,ClassLoader还负责加载 Java 应用所需的资源,如图像文件和配置文件等。不过本文只讨论其加载类的功能。

1.3     什么是ClassLoader Delegation

细节请参见:http://blog.csdn.net/eric_sunah/article/details/7969077

关于类加载器的层次结构,以下的几点说明可能更有助于进一步的理解类的查找和加载过程:

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

如果一个类加载器以及它所有的父类加载器都无法找到所需的类,系统就会抛出 ClassNotFoundExecption 异常或者 NoClassDefFoundError 的错误

1.4     WAS的Class Loader

WebSphere 中类加载器的层次结构图1 所示:

如上图所示,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 模块定义自己的类加载器。

1.5     WebSphere 中的类加载器策略

WebSphere 中对类加载器有一些相关的配置,称为类加载器策略(class loader policy )。类加载器策略指类加载器的独立策略(classloader isolation policy ), 通过类加载器策略设置,我们可以为WAS 和应用程序的类加载器进行独立定义。

每个WAS 可以配置自己的应用程序类加载器策略,WAS 中的每个应用程序也可以配置自己的Web 模块类加载器策略,下面我们对这两种策略分别介绍。

(官方配置手册:http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frzatz%2F51%2Fprogram%2Fclsadmcns.htm)

1.5.1   应用服务器(WAS )配置:应用程序类加载器策略

应用服务器对应用程序类加载器策略有两种配置:

  • Single :整个应用服务器上的所有应用程序(Jar,RAR,EJBJAR)使用同一个类加载器(Application classloader)。在这种配置下,每个应用程序不再有自己的类加载器,每个Application中jar文件可以互相访问。

部署模型如下:

  • Multiple(DEFAULT) :应用服务器上的每个应用程序使用自己的类加载器。

部署模型如下:

  • WAR如何被加载,由WAR单独的侧率来决定

1.5.2    应用程序配置:Web 模块类加载器策略

应用程序中对Web模块类加载器有两种配置:

  • Application :整个应用程序内的所有的实用程序 jar 包和 Web 模块使用同一个类加载器。
  • Module(DEFAULT) :应用程序内的每个 Web 模块使用自己的类加载器。应用程序的类加载器仍然存在,负责加载应用程序中 Web 模块以外的其它类,包括所有的实用程序 jar 包。

1.5.3 ClassLoader模式的设置
该设置针对Application/WAR加载器都有效

  • Parent_First :在加载类的时候,在从类加载器自身的类路径上查找加载类之前,首先尝试在父类加载器的类路径上查找和加载类。
  • Parent_Last :在加载类的时候,首先尝试从自己的类路径上查找加载类,在找不到的情况下,再尝试父类加载器类路径。

1.6     综合配置的小例子

Websphere的类加载器以及策略的简单介绍相关推荐

  1. gitlab 的使用策略和简单介绍

    gitlab 作为版本控制器,基本使用和github 相同,以下是一些策略和介绍: Git 分支管理策略可以参考下面三个链接: http://www.ruanyifeng.com/blog/2012/ ...

  2. 深入理解Java类加载器:Java类加载原理解析

    http://blog.csdn.net/zhoudaxia/article/details/35824249 1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpi ...

  3. 深入理解JVM(1):类加载器

    文章目录 一.类加载简介 1.简介 2.Java虚拟机与程序的生命周期 3.类的加载.连接与初始化(类加载的最重要的3个阶段) 3.1加载 3.2连接 3.3 初始化 4.类的使用和卸载(类加载的剩余 ...

  4. 深入探讨 Java 类加载器

    深入探讨 Java 类加载器 类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加 ...

  5. 深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题

    转载自 深入JVM系列(三)之类加载.类加载器.双亲委派机制与常见问题 一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用 ...

  6. JVM 学习三:类加载器

    类加载器 1 类加载器的分类 JVM 支持两种类型的类加载器:引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader) 从概念上来 ...

  7. 深入理解Java类加载器(2)

    1 基本信息 每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...

  8. 通过这一篇文章,可以把Java中的类加载器了解的七七八八了

    对于每个开发人员来说,java.lang.ClassNotFoundExcetpion这个异常几乎都遇到过,而追求其该异常的来源的话,就免不了谈一谈Java的类加载器了.本文就基于启动类加载器.扩展类 ...

  9. JVM—类加载器和双亲委派模型

    关注微信公众号:CodingTechWork,一起工作学习总结. 文章目录 引言 类加载器 类与类加载器关系 类加载器分类 启动类加载器 扩展类加载器 应用程序类加载器 双亲委派模型 介绍 工作流程 ...

最新文章

  1. Java嵌套构造函数造成的stack overflow异常
  2. sap wm内向交货步骤_内向型人在数据科学中成功的五个有效步骤
  3. 搭建主从数据库出现的错误 error connecting to master ‘slave@172.17.0.2:3306‘ - retry-time: 30 retries: 1
  4. ASP.NET MVC PartialView用法
  5. jquery 鼠标事件汇总
  6. 60名英语专八的半年苦战:机器智能背后有一群“数字工人”
  7. 摆脱IDE进行时. . .
  8. Asterisk 函数
  9. 基础知识:计算机网络--《趣谈网络协议》读书笔记
  10. chrome python插件,珍藏版Chrome插件送给你们,不仅是程序员必备
  11. [转]overflow解决float浮动后高度自适应问题
  12. numpy.loadtxt() 详细用法
  13. python-matplotlib绘图 -应用subplots_adjust()方法解决图表与画布的间距问题
  14. 技术总监7年总结,如何进行正确的沟通?
  15. 趣味点名软件_网传川大教授用刷脸软件点名 学生无人敢逃课
  16. 认知能力训练系统--提升6大认知能力
  17. PS 有哪些小技巧让你好用到哭?
  18. 项目经理的知识和技能,学会这些你就是合格的PM
  19. Power BI 字符串填充一些特定的字符补齐位数
  20. C++学习(一一七)pdb文件

热门文章

  1. C# 任务栏的相关信息
  2. Flex 按钮添加图标
  3. c++ map的使用方法[转]
  4. 软件项目经理职责[转](
  5. javaBean为什么要implements Serializable
  6. [shell进阶]——shell多线程
  7. 使用 FTP 迁移 SQL Server 数据_迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云...
  8. ubuntu 安装自动解决依赖冲突
  9. CORBA GIOP消息格式学习
  10. iOS8 用AVAudioPlayer播放音乐(Swift)