概述

类加载机制:java类 ->字节码文件.class->将字节码文件加载jvm内存中
类加载器:JVM启动的时候先把类加载器读取到内存中,以方便去加载其他的类文件。

JVM的类加载机制

JVM的类加载机制中有一个非常重要的角色,叫做类加载器。类加载器有自己的体系。JVM内置了几种类加载器:引导类加载器,扩展类加载器,系统类加载器,他们之间形成父子关系,通过parent属性来定义这种关系,最终形成树结构。整体关系如下:


除此之外,用户也可以自定义类加载器。
当JVM运行过程中,用户也自定义了类加载器去加载一些类的时候,会按照如下机制加载。

  1. 用户自己的类加载器,把加载请求传给父加载器,父加载器传给它的父加载器,一直到加载器树的顶层。
  2. 最顶层的类加载器首先对其特定位置加载,如果加载不到就传给子类。
  3. 如果一直到底层的类加载器都没有加载到,就会抛出异常ClassNotFoundException。
    因此,如果在classpath指定的目录中和自己工作目录中存放同样的class文件,会优先加载classpath目录中的文件。

双亲委派机制

双亲委派机制:当某个类加载器需要加载某个.class文件时,首先把这个任务委托给他的上级类加载器,递归此操作,如果上级的类加载器没有加载,自己再去加载。
作用:

  1. 防止重复加载同一个.class。
  2. 保证核心.class不会被篡改。通过委托的方式,不会去篡改核心的.class文件,即使篡改了也不会被加载,即使加载也不是同一个.class文件。不同的类加载器加载同一个.class也不是同一个.class对象。保证了.class文件的执行安全。(例如,一个Object类,如果去加载修改的,真正的Object就被篡改了)

Tomcat的类加载机制

Tomcat的类加载机制对JVM的类加载机制做了一些修改,打破了双亲委派机制。按照应用去加载,避免按照路径加载的时候,因为版本不同而加载错误的类。整体如下:

  1. 引导类加载器和扩展类加载器的作用不变。
  2. 系统类加载器正常情况下加载的是CLASSPATH下的类,但是Tomcat的启动脚本并未使用,而是加载Tomcat启动的类,比如Bootstrap.jar,通常在catalina.bat或者catalina.sh中指定,位于Tomcat的bin目录下。
  3. Commons类加载器加载Tomcat使用以及应用通用的类,位于Tomcat的lib下。
  4. Catalina类加载器 用于加载服务器内部可见类,这些类应用程序不能访问。
  5. Shared类加载器用于加载应用程序共享类,服务器不会依赖。
  6. WebApp类加载器,每个应用都会有一个独一无二的WebApp类加载器,用来加载自身WEB-INF/classes和WEB-INF/lib下的类。

Tomcat整体类加载机制的流程如下:

  1. 首先从Bootstrap 类加载器加载指定的类
  2. 如果未加载到,则从WEB-INF/classes加载
  3. 如果未加载到,则从WEB-INF/lib加载
  4. 如果未加载到,则依次从System,Commons,Shared加载。(最后一步遵从双亲委派机制,即:依次递归到System加载器加载开始)

Tomcat修行之路-3.类加载机制的原理相关推荐

  1. Tomcat、Websphere和Jboss类加载机制

    http://blog.csdn.net/lshxy320/article/details/6448972 2       Tomcat 类加载机制 Tomcat Server 在启动的时候将构造一个 ...

  2. Java基础——类加载机制及原理

    一.什么是类的加载? 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结 ...

  3. Tomcat 的类加载机制

    在前面 Java虚拟机:对象创建过程与类加载机制.双亲委派模型 文章中,我们介绍了 JVM 的类加载机制以及双亲委派模型,双亲委派模型的类加载过程主要分为以下几个步骤: (1)初始化 ClassLoa ...

  4. 图解Tomcat类加载机制(阿里面试题)

    Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给 ...

  5. Tomcat的类加载机制

    关于Java的类加载机制推荐这一篇:深入探讨Java类加载机制 本文转载自:https://www.cnblogs.com/aspirant/p/8991830.html Tomcat的类加载机制是违 ...

  6. 类加载机制:双亲委任模型和tomcat类加载器

    简介 类是如何加载的,那么必须要面对的几个问题如下 什么是类加载机制? 什么是双亲委任模型? 如何破坏双亲委任模型? Tomcat 的类加载器是怎么设计的? 类加载机制 Java 中的类加载器大致可以 ...

  7. 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制

    Tomcat源码学习--WebAppClassLoader类加载机制 在WebappClassLoaderBase中重写了ClassLoader的loadClass方法,在这个实现方法中我们可以一窥t ...

  8. Tomcat WebappClassLoader 类加载机制源码分析

    需要了解的知识JVM 类加载机制深入浅出 tomcat中的ClassLoader 启动类加载器(BootStrap ClassLoader):引导类装入器是用本地代码实现的类装入器,它负责将 jdk中 ...

  9. 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制

    转载自 违反ClassLoader双亲委派机制三部曲第二部--Tomcat类加载机制 前言: 本文是基于 ClassLoader双亲委派机制源码分析 了解过正统JDK类加载机制及其实现原理的基础上,进 ...

  10. 【胖虎的逆向之路】01——动态加载和类加载机制详解

    胖虎的逆向之路 01--动态加载和类加载机制详解 一.前言 二.类的加载器 1. 双亲委派模式 2. Android 中的类加载机制 1)Android 基本类的预加载 2)Android类加载器层级 ...

最新文章

  1. Rocksdb 事务(一): 隔离性的实现
  2. 自己动手丰衣足食之 jQuery 数量加减插件
  3. 杂记-01.xcode模拟器管理
  4. 平安智慧城市:与时代同行,坚定数字化之路
  5. 算法导论吃透后的水平_初学算法,你应该这么玩
  6. 《Spring2.0 技术手册》读书笔记五-与Spring容器的交互(2)
  7. Linux中exit与_exit的区别
  8. c# 命名空间命名规范_C#中的命名空间
  9. PyCharm配置Docker
  10. STM32工作笔记0090---ADC基本原理-M3
  11. tenrrt编译出错
  12. Web的测试内容和方法【转贴】
  13. 【车牌识别】基于matlab GUI汽车出入库收费系统(带面板)【含Matlab源码 735期】
  14. 多元高斯分布(三)——高斯过程
  15. MATLAB命令大全
  16. 配对碱基链(C语言)
  17. APP渠道推广手册(新手必备)
  18. 在Ubuntu18.04上编译SWASH模型
  19. 坚果云WebDav示例
  20. atrix 4g 安装linux,亲测ATRIX 4G MB860详细刷机教程二:解锁bootloader

热门文章

  1. 【算法设计与分析】三个博弈论算法分析
  2. 房价会象汽车电脑一样下降
  3. 内存颗粒和闪存颗粒的区别_内存条怎么判断好坏? 内存颗粒的种类及其差别介绍...
  4. c++11 std::decay源码剖析
  5. 推荐一款高效的处理延迟任务神器
  6. DP转HDMI方案|CS5216方案应用|CS5216设计方案
  7. C++ Bulider6.0下string类型问题
  8. 杜撰——深圳市贝力公司电子商务方案
  9. 【安卓小笔记】自己制作一个Launcher
  10. 金融工程python报告期权_金融工程专业详细解析