JVM理论(二)类加载子系统

类加载流程

类加载流程
  • 类加载器子系统负责从文件系统或者网络中加载class文件,class文件的文件头有特定的文件标识(CAFEBABE是JVM识别class文件是否合法的依据)
  • classLoader只负责文件的加载,而执行引擎决定它是否被执行
  • 加载类的信息存放在运行时数据区的方法区中,方法区还包括常量池信息

 类加载过程由加载,链接,初始化构成

加载(Loading)

加载阶段需要完成以下三个过程:

  • 通过类的全限定名来获取其定义的二进制字节流;
  • 将字节流所代表的静态存储结构转化为元空间(JDK8前称为方法区)的运行时数据结构;
  • 在堆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指定的类库,如果在应用程序中没有自定义类加载器,一般情况下作为程序中默认的类加载器

自定义类加载器

主要作用

  • 隔离加载类(如项目工程中的中间件需要引入自己jar包,为了避免与其他工程具有相同类的冲突,我们可以自定义类加载器,实现不同中间件的隔离)
  • 修改类加载方式
  • 扩展加载源
  • 防止源码泄漏

扩展

  • sun.misc.Launcher是java虚拟机的入口应用,扩展类和系统类(App)定义在Launcher类下
  • 加载器之间的关系只是包含关系,不是上层下层,也不是父子类的继承关系

双亲委派机制

双亲委派模式

Java虚拟机对class文件采用的是按需加载方式,即当需要使用该类时才会将它的class文件加载到内存生成class对象,而且在加载某个类class文件时,Java虚拟机采取的是双亲委派模式,即将请求交由父类处理,它是一种任务委派模式

委派执行流程

  1. 类加载器收到了类加载的请求时,不会自己先去尝试加载这个类,而是把请求委托给父加载器去执行
  2. 如果父加载器还存在父类加载器,则依次向上委托,因此类加载请求最终都应该被传递到顶层的启动类加载器中
  3. 如果父类加载器可以完成类加载请求,就直接成功返回,只有当父加载器在无法完成该加载,子加载器才会尝试自己去加载该类

沙箱安全机制

假设自定义一个类名为String且所在包为java.lang,在使用引导类加载器加载时会先加载JDK(rt.jar包下的java/lang/String.class)中的String类,因为这个类本来是属于jdk的,后面再次出现String类就会报错,以此保证核心源代码不被恶意篡改,这就是沙箱安全机制。

链接(Linking)

执行流程依次为验证->准备->解析

验证

其目的在于确保Class文件的字节流中包含的信息符合当前虚拟机的要求,保证加载类的正确性,不会危害虚拟机自身的安全
验证内容:

  • 文件格式验证:验证字节流是否符合Class文件格式的规范
  • 元数据验证:确保其描述的信息符合Java语言规范的要求
  • 字节码验证:确定程序语义符合逻辑
  • 符号引用验证:确保解析动作能正确执行

准备

为类的静态变量分配内存,并初始化为默认值,仅包括类变量(static修饰,不包括final-static修饰),这里也不会为实例变量分配初始化,实例变量会随着对象一块分配到Java堆内存中

比如:某类中定义一个静态变量:private static int i = 10;此时在准备阶段i = 0,在后续的初始化阶段才会被赋值为10

解析

将常量池中的符号引用转换为直接引用的过程,直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。解析主要针对类或接口、字段、类方法、接口方法、方法类型等,解析的动作实际是会随着JVM在执行完初始化之后再执行的。

初始化(Initialization)

  • 初始化就是执行类构造器clinit()方法的过程
  • 该方法不需要自定义,是javac编译器自动收集类中的所有类变量的显示赋值动作和静态代码块中的语句合并而来
  • 构造器方法中你指令按语句在源文件中出现的顺序执行
  • JVM要保证clinit()方法在多线程访问下的安全性,即被同步加锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13987.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零配置 linux 开发环境

文章目录 目的效果图配置本地 Windows 主机好用工具WSLSSH 连接远程 Linux 开发机配置本机字体【in-prog】配置 vscode 远程连接 配置远程 Linux 主机zsh & oh-my-zsh配置 github 的 SSHneovimvundleinit.vim 文件 vim-plug.lua 文件 tmuxclangcpplint 目的 记录下我的开发…

idea配置本地maven保姆级教程

一、说在前面 idea默认会带有maven插件,原则上是可以不需要配置的。但有个缺点,他是把本地仓库直接安装在了系统盘里面,随着时间的推移,仓库越来越大,笔记本的压力会比较大。 本文是下载自己的maven包,集…

Linux命令(41)之top

Linux命令之top 1.top介绍 linux命令top是用来实时监测服务器资源的使用状况&#xff0c;包含进程、cpu、内存等等 2.top用法 top [参数] top常用参数 参数说明-d屏幕刷新时间间隔-i<time>设置刷新时间间隔-u<user>指定用户名-p<pid>指定进程号 top命令中…

运输层:TCP可靠传输

1.运输层&#xff1a;TCP可靠传输 笔记来源&#xff1a; 湖科大教书匠&#xff1a;TCP可靠传输 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 TCP实现可靠传输的方式&#xff1a;以字节为单位的滑动窗口 发送方将31 ~ 41号报文段发送 假设32 ~ 3…

【人工智能与机器学习】基于卷积神经网络CNN的猫狗识别

文章目录 1 引言2 卷积神经网络概述2.1 卷积神经网络的背景介绍2.2 CNN的网络结构2.2.1 卷积层2.2.2 激活函数2.2.3 池化层2.2.4 全连接层 2.3 CNN的训练过程图解2.4 CNN的基本特征2.4.1 局部感知&#xff08;Local Connectivity&#xff09;2.4.2 参数共享(Parameter Sharing)…

深度学习实战41-基于LSTM-GRU模型搭建对糖尿病数据的预测与应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习实战41-基于LSTM-GRU模型搭建对糖尿病数据的预测与应用&#xff0c;本文将向大家介绍一种基于LSTM-GRU的糖尿病预测模型&#xff0c;包括模型的原理、中文糖尿病csv数据样例、利用PyTorch框架进行模型训练与…

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前信息和状态&#xff1b;通过语音识别模块对当前垃圾种类进行语音识别&#xff1b; 通过蜂鸣器进行声光报警提醒垃圾桶已满&#xff1b;采用舵机控制垃圾桶打开关闭&#xff1b;超声波检测当前垃圾桶满溢程度&#xff1…

K8s集群部署最新Jenkins 2.387.1

K8s集群部署最新Jenkins 2.387.1 概述环境准备设置存储目录并启动NFS服务安装 NFS 服务端 动态创建 NFS存储&#xff08;动态存储&#xff09;部署jenkins服务 概述 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作…

虚假人脸检测实验

虚假人脸检测实验 虚假人脸识别 数据集链接 链接&#xff1a;https://pan.baidu.com/s/1hDyJ91dAwI5j5GTR0hD_cA?pwd4cki 原理 ResNet-18是一种经典的CNN网络&#xff0c;是 Deep Residual Learning 团队在 2017 年提出的。它是为了解决 ImageNet 数据集上的图像分类任务而…

SOLIDWORKS小问题解答 硕迪科技

众所周知&#xff0c;SOLIDWORKS的使用者非常多&#xff0c;在使用过程中呢也会有一些小问题&#xff0c;前几天就有朋友来咨询了两个问题&#xff0c;可能其他使用者也有这样的问题&#xff0c;所以今天硕迪科技统一为大家解答 问题一&#xff1a;SOLIDWORKS装配图中的颜色怎么…

Java对象内存布局和对象头

文章目录 1 定义2 详细介绍2.1 对象头2.1 实例数据2.1 对齐填充 3 JOL查看内存布局 1 定义 2 详细介绍 2.1 对象头 【对象标记】 Mark Word 【类元信息】 又名类型指针 2.1 实例数据 2.1 对齐填充 3 JOL查看内存布局 public class ObjectLayout {public static void …

前端学习——CSS3

新增长度单位 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>Document</title><style>* {margin: 0;padding: 0;}.box1 {width: 200px;height: 200px;background-color: deepskyblue;…