java 类的加载机制详解
类加载
java程序运行时类加载的方式和流程是:
编译 》加载 》验证 》准备 》解析 》初始化
编译:将java代码编译为字节码文件
加载:查找并通过io读入字节码文件,在内存中生出一个代表类的class对象,作为访问方法区的
输入入口,使用到类的时候才会加载
验证:字节码的校验,是否正确
准备:给类的静态变量分配内存,并赋予默认值
解析:将符号引用替换为直接引用,静态链接过程
初始化:对类的静态遍历,初始化指定值,执行静态代码块
类加载器
以上的流程中类加载过程主要通过类加载器实现,java中主要有四个类加载器
引导类加载器
负责加载jre lib目录下的核心类库,如charset.jar,rt.jar等
扩展类加载器
负责加载lib目录下 ext扩展目录的jar类包
应用程序类加载器
负责加载classPath 路径下的类包,就是我们写的代码
自定义加载器
负责加载用户自定义路径的类
双亲委派机制
上述加载器的加载顺序是:首先加载自定义加载器,然后是应用程序类加载器,然后再是扩展类加载器,最后才是引导类加载器
加载的方式:
自定义加载器加载 加载到类 则返回
没有找到,向上委托(父加载器,没有继承关系)
appClassLoad(应用程序加载器) 加载到类 返回
没有找到,委托上级
extClassLoad(扩展类加载器) 加载到类 返回
没有找到,委托上级
classLoad(引导类) 加载到类 向下委托
没有找到,再向下委托 。。。。
流程:
自定义 》》 app 》》 ext 》》 system 》》 ext 》》 app 》》自定义
这个就是所谓的双亲委派机制。那么这儿可能就有疑问了:
为啥不从system(引导类) 开始往下找,还要来回循环一遍?
基本上大部分的类加载的都是我们自己写的内容(自带的内容需要加载的很少),双亲委派机制只有第一次会从app开始加载,第二次的时候不用再向上委托了,如果从system开始往下找,那么循环会更多次。
还有两个特别重要的原因(主要原因)
1. 沙箱安全机制,避免核心api库被篡改
比如我也定义个String,如果从上往下,那么String不是被覆盖了?
2. 避免类的重复加载
自定义类加载器实现
只需要继承ClassLoader, 该类有两个核心方法,一个是loadClass(String, boolean),
实现了双亲委派机制,还有一个方法是findClass,默认实现是空方法,所以我们自定义
类加载器主要是重写findClass方法。
打破双亲委派机制
如何打破双亲委派机制?
其实很简单,就不往上委托,自己去加载
重写我们的 loadClass方法就可以了,但是要注意核心的比如Object这种类不能自定义
加载(会有沙箱安全问题)
java默认是双亲委派机制,为什么要打破?
最常见的打破双亲委派机制就是我们的Tomcat
原因:
1.tomcat 是一个容器,同时会部署多个应用,如果我们多个应用程序用的东西都
是不同版本的,一个jdk6 一个jdk8 那么不是就出问题了?所以要保证相互隔离
2.相同的类库相同的版本最好能共享,不然有10个就需要10个相同类库加载
3.基于安全考虑,应用程序的类库和web容器类库要隔离开来
java 类的加载机制详解相关推荐
- Java类的加载过程详解 面试高频!!!值得收藏!!!
受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...
- Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)
[1]类的生命周期 一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载->验证->准备->解析->初始化->使用->卸载 其中,类加载包括5个阶段: 加载 ...
- 中yeti不能加载_第二十章_类的加载过程详解
类的加载过程详解 概述 在 Java 中数据类型分为基本数据类型和引用数据类型.基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载 按照 Java 虚拟机规范,从 Class 文件到加载到内 ...
- php自动加载类与路由,PHP实现路由与类自动加载步骤详解
这次给大家带来PHP实现路由与类自动加载步骤详解,PHP实现路由与类自动加载步骤详解的注意事项有哪些,下面就是实战案例,一起来看一下. 项目目录如下 入口文件index.php<?php def ...
- 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器
28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...
- 深入理解Java虚拟机:Java类的加载机制
本篇内容包括:Java 类的加载机制(Jvm 结构组成.Java 类的加载).类的生命周期(加载-验证-准备-解析-初始化-使用-卸载).类加载器 以及 双亲委派模型. 一.Java 类的加载机制 1 ...
- 初识jvm-1.Java类的加载机制
转载: jvm系列---纯洁的微笑 地址: http://www.ityouknow.com/jvm.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其 ...
- jvm系列(一):java类的加载机制
1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结 ...
- java类的加载机制
一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
- 类的加载过程详解:加载、验证、准备、解析、初始化
想要弄明白的知识点: 类加载的过程,加载.验证.准备.解析.初始化.每个部分详细描述. 加载阶段读入.class文件,class文件时二进制吗,为什么需要使用二进制的方式? 验证过程是防止什么问题?验 ...
最新文章
- 循序渐进Python3(十一) --6-- Ajax 实现跨域请求 jsonp 和 cors
- 、PHP只能访问mysql_php中 mysql函数不能调用,只有mysql_query()可以用
- Linux crontab 命令格式与详细例子
- vector c++ 赋值_面对拷贝赋值时发生的自我赋值的正确态度时接受而不是防止
- 基础知识(四)Dijkstra算法
- linux更换域名全站301,linux服务器wdcp面板做301域名重定向设置
- 首个月球旅客!SpaceX将送普通人上太空,马斯克暗示首单来自日本
- c++之static的一些用法
- 软件开发常用设计模式—单例模式总结(c++版)
- L298电机驱动原理图+PCB
- pth(pass the hash)哈希传递攻击
- Redis 哨兵安装-Centos
- 软件实训:手把手写一个简单的javaweb项目
- 怎样做一个拥有全局观的人
- dma_alloc_coheren
- Delphi图像处理 -- 灰色浮雕
- C.Defuse the Bombs(简单二分)
- 无线通信学习笔记(一)
- MySQL命令行导出数据库(sql脚本)
- OSG三维渲染引擎编程学习之一:“第一章:OSG介绍” 之 “1.1 OSG简介”