虚拟机系列 | JVM类加载机制
本文源码:GitHub·点这里 || GitEE·点这里
一、类加载简介
类的加载机制是指把编译后的.class类文件的二进制数据读取到内存中,并为之创建一个java.lang.Class对象,用来封装类在元数据空间的数据结构。
类在JVM中的生命周期为:加载,连接,初始化,使用,卸载。不过这里只重点描述加载,连接,初始化这三个过程。
二、加载过程
基于一张图看类加载子系统的细节流程:
1、加载阶段
过程描述
加载阶段需要完成以下三个过程:
- 通过类的全限定名来获取其定义的二进制字节流;
- 将字节流所代表的静态存储结构转化为云数据空间的运行时数据结构;
- 在堆Heap中生成一个代表这个类的java.lang.Class对象,作为对元数据空间中这些数据的访问入口;
类加载器
- 引导类加载器
Bootstrap-ClassLoader基于C/C++实现,负责加载Java的核心类库JAVA_HOME\jre\lib\rt.jar,该加载器不继承自ClassLoader抽象类,并且只加载包名为java、javax、sun等开头类,一次保证对核心源码的保护。
- 扩展类加载器
Extension-ClassLoader,基于Java语言,由sun.misc.Launcher$ExtClassLoader实现,派生于ClassLoader抽象类,从java.ext.dirs系统变量指定的路径中的加载类库,或者JDK安装目录jre\lib\ext目录下加载。
- 系统类加载器
Application-ClassLoader,基于Java语言,由sun.misc.Launcher$ExtClassLoader实现,它负责加载环境变量ClassPath指定的类库,如果在应用程序中没有自定义类加载器,一般情况下作为程序中默认的类加载器。
2、连接阶段
验证
目的在于确保Class文件的字节流中包含的信息符合当前虚拟机的要求,保证加载类的正确性,不会危害虚拟机自身的安全,主要包括四种检验动作:
- 文件格式验证:验证字节流是否符合Class文件格式的规范;
- 元数据验证:确保其描述的信息符合Java语言规范的要求;
- 字节码验证:确定程序语义是符合逻辑的;
- 符号引用验证:确保解析动作能正确执行。
准备
为类的静态变量分配内存,并初始化为默认值,这时候进行内存分配的仅包括类变量(static)修饰,不包括(final-static)修饰的,这里也不会为实例变量分配初始化,实例变量会随着对象一块分配到Java堆中。
解析
将常量池中的符号引用转换为直接引用的过程,直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。解析主要针对类或接口、字段、类方法、接口方法、方法类型等,解析的动作实际是会随着JVM在执行完初始化之后再执行的。
3、初始化阶段
执行类构造器()方法的过程,该方法不需要自定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来,Jvm要保证()方法在多线程访问下的安全性。
三、机制策略
1、双亲委派模式
类加载器收到了类加载的请求时,不会自己先去尝试加载这个类,而是把请求委托给父加载器去执行;
如果父加载器还存在父类加载器,则依次向上委托,因此类加载请求最终都应该被传递到顶层的启动类加载器中;
如果父类加载器可以完成类加载请求,就直接成功返回,只有当父加载器在无法完成该加载,子加载器才会尝试自己去加载该类;
2、沙箱安全机制
假设自定义一个类名为String且所在包为java.lang,在使用引导类加载器加载时会先加载JDK中的String类,因为这个类本来是属于jdk的,后面再次出现String类就会报错,以此保证源代码不被恶意篡改,这就是沙箱安全机制。
四、源代码地址
GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent
推荐阅读:编程体系整理
序号 | 项目名称 | GitHub地址 | GitEE地址 | 推荐指数 |
---|---|---|---|---|
01 | Java描述设计模式,算法,数据结构 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
02 | Java基础、并发、面向对象、Web开发 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆ |
03 | SpringCloud微服务基础组件案例详解 | GitHub·点这里 | GitEE·点这里 | ☆☆☆ |
04 | SpringCloud微服务架构实战综合案例 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
05 | SpringBoot框架基础应用入门到进阶 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆ |
06 | SpringBoot框架整合开发常用中间件 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
07 | 数据管理、分布式、架构设计基础案例 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
08 | 大数据系列、存储、组件、计算等框架 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
虚拟机系列 | JVM类加载机制相关推荐
- JVM基础系列第7讲:JVM 类加载机制
当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...
- 深入理解JVM虚拟机6:深入理解JVM类加载机制
深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...
- 【Java虚拟机规范】JVM类加载机制
[Java虚拟机规范]JVM类加载机制 理论知识 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading).验证(Verification).准备(Prep ...
- 【面试】JVM类加载机制
本系列为大厂面试题系列的相关笔记,如有误,欢迎大家指正. JVM类加载机制 类加载器 虚拟机设计团队把加载动作放到JVM外部实现,以便于引用程序决定如何获取所需的类,JVM提供了三种类加载器 启动类加 ...
- jvm类加载机制_面试:对于JVM类加载机制深度解析
目录: 前文回顾 JVM在什么情况下会加载一个类? 从实用角度出发,来看看验证.准备和初始化的过程 核心阶段:初始化 类加载器和双亲委派机制 1.前文回顾 咱们今天先来回顾一下昨天讲到的JVM整体的一 ...
- jvm类加载机制_JVM 类加载机制
学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑 Java 的类加载机制,这是 Java 的一个很重要的创新点,曾经也是 Java 流行的重要原因之一. Oracle 当初引入这个机制是为 ...
- JVM(2)——JVM类加载机制
一.JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言里面 ...
- JVM类加载机制详解
本文来详细说下JVM类加载机制 文章目录 概述 类加载器是什么 类加载的过程 加载 连接 初始化 类的主动引用和被动引用 主动引用 被动引用 三种类加载器 双亲委托机制 核心思想 源码分析 类的动态加 ...
- 详解JVM类加载机制
详解JVM类加载机制 笔者的笔记都记录在有道云里面,因为公司原因办公电脑无法使用有道云,正好借此机会整理下以前的笔记顺便当做巩固复习了,也因为记笔记的时候不会记录这些知识来源何地,所以如果发现原创后可 ...
最新文章
- LINUX内核经典面试题30道及解答
- 后台提示云提醒未激活 点击激活删除方法
- 【Android】EditText的一个问题
- python super 变参数问题(六)
- linux中find查找命令的mtime参数使用方法说明
- Update function module call in SM13
- MyEclipse 如何将 jar 包导入项目中
- MongoDB 自动删除集合中过期的数据——TTL索引
- android studio1.5 for mac,适用于Mac的Android Studio 1.5.x随机崩溃
- Python3——通用序列操作
- php smarty数学函数,smarty详解二:从文件读取变量、保留变量、数学计算、内建函数...
- Java、JSP公文流转系统分析与实现
- mysql 源码阅读_mysql 源码阅读入口
- 趣图:你永远想不到用户怎么使用你的产品
- java导出excel带上进度条_导出数据至Excel前台js进度条不能隐藏
- google play连接超时_Google框架一键安装
- el-form表单添加自定义验证
- 快速批量修改文件名字
- Excel-将图表数据标签是0的值不显示
- Django——在线教育项目总结