JAVA类加载过程/类装载的执行过程/java类加载机制/JVM加载Class文件的原理机制?

news2024/11/15 21:56:17

 JAVA类加载过程/类装载的执行过程/java类加载机制/JVM加载Class文件的原理机制?

类加载的过程主要分为三个部分:(加链初,验准解)

  • 加载
  • 链接
  • 初始化

而链接又可以细分为三个小部分:

  • 验证
  • 准备
  • 解析

骚戴理解:首先把class字节码文件从各个来源通过类加载器装载入内存中(加载),然后验证加载进来的字节码是否符合虚拟机规范(验证),Java虚拟机为类变量分配内存,并且赋予默认初始值(准备),虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址,也就是直接引用(解析),执行类构造器对类变量进行自定义的初始化(初始化)

1、加载

简单来说,加载指的是把class字节码文件从各个来源通过类加载器装载入内存中。

这里有两个重点:

字节码来源

  • 一般的加载来源包括从本地路径下编译生成的.class文件
  • 从jar包中的.class文件
  • 从远程网络中获取
  • 动态代理实时编译

类加载器

  • 启动类加载器
  • 扩展类加载器
  • 应用类加载器
  • 自定义类加载器

为什么会有自定义类加载器?

  • 一方面是由于java代码很容易被反编译,如果需要对自己的代码加密的话,可以对编译后的代码进行加密,然后再通过实现自己的自定义类加载器进行解密,最后再加载。
  • 另一方面也有可能从非标准的来源加载代码,比如从网络来源,那就需要自己实现一个类加载器,从指定源进行加载。

2、验证

主要是为了保证加载进来的字节码是否符合虚拟机规范

  • 对于文件格式的验证,比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息?
  • 对于元数据的验证,比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?是否出现了不合理的重载?
  • 对于字节码的验证,保证程序语义的合理性,比如要保证类型转换的合理性。
  • 对于符号引用的验证,比如校验符号引用中通过全限定名是否能够找到对应的类?校验符号引用中的访问性(private,public等)是否可被当前类访问?

3、准备(默认初始化)

主要是为类变量分配内存,并且赋予默认初始值

特别需要注意,初值不是代码中具体写的初始化的值,而是Java虚拟机根据不同变量类型的默认初始值。

比如8种基本类型的初值,默认为0;引用类型的初值则为null;常量的初值即为代码中设置的值,final static tmp = 456, 那么该阶段tmp的初值就是456

4、解析

将常量池内的符号引用替换为直接引用的过程。

两个重点:

  • 符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。
  • 直接引用。可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的引用;而实例方法,实例变量的直接引用则是从实例的头引用开始算起到这个实例变量位置的偏移量

举个例子来说,现在调用方法hello(),这个方法的地址是1234567,那么hello就是符号引用,1234567就是直接引用。

在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。

5、初始化(自定义初始化)

这个阶段主要是对类变量进行自定义的初始化,是执行类构造器的过程。其实就是根据程序员自己设置的值对类变量进行赋值

int a = 5;

在准备阶段就是为这个a变量分配内存空间,并且赋其默认值,也就是准备阶段a=0,因为int类型的默认值为0,然后在初始化阶段就是把程序员设置的值赋值给对应的类变量,所以把5赋值给a,a=5。

注意:类加载的几个阶段都只针对类变量,所以类变量以外的变量赋值不会在类加载过程中体现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

散点图适用于什么数据 thinkcell散点图设置不同颜色

在数据可视化的众多工具和技巧中,散点图是一种极为有效的方式,能够揭示变量之间的关系,尤其是在探索数据集的相关性、分布趋势、集群现象时。而在众多助力于制作高质量散点图的工具中,think-cell插件以其高效的操作和丰富的功能&a…

重定向与追加

1、>和>> > 【重定向】 如果文件不存在,则创建,并将内容输入到文件; 如果文件存在,则先清空文件,然后将内容输入到文件;>> 【追加】 如果文件不存在,则创建&…

自监督学习self-supervised learning

Tags: #tutorial #machine-leanring #self-supervised 目录: The Importance of Self-Supervised Learning Popular Learning Methods Introduction to Self-Supervised Learning 1. The Inportance of Self-Supervised Learning 监督学习(supervised learnin…

【面试】tomcat类加载机制

目录 1. 说明2. 主要类加载器2.1 Bootstrap类加载器2.2 Common类加载器2.3 Catalina类加载器2.4 Shared类加载器2.5 Web应用类加载器2.5 JSP类加载器 3. 图示4. 特点5. 加载顺序6. 面试题 1. 说明 1.tomcat的类加载机制是违反了双亲委派原则的,对于一些未加载的非基…

初识指针3の学习笔记

目录 1>>前言 2>>冒泡排序 3>>二级指针 4>>指针数组 5>>指针数组模拟二维数组 6>>结语 1>>前言 今天我会继续分享一些我做的笔记,以及我对指针的理解, 后续会持续分享指针几天,毕竟指针的内…

实验室安全分级分类管理系统在高校中的具体应用

盛元广通高校实验室安全分级分类管理系统的构建,旨在通过科学合理的管理手段,提高实验室的安全水平,保障师生的人身安全,防止实验事故的发生。这一系统通常包括实验室安全等级评估、分类管理、风险控制、安全教育与培训、应急响应…

[Qt][绘图][上]详细讲解

目录 0.为什么?1.绘图API核心类2.设置画笔3.设置画刷4.设置画家1.移动画家位置2.保存/加载画家的状态 0.为什么? 虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景,很多时候,需要更强的"定制…

第N8周:使用Word2vec实现文本分类

本文为365天深度学习训练营 中的学习记录博客原作者:K同学啊 一、数据预处理 任务说明: 本次将加入Word2vec使用PyTorch实现中文文本分类,Word2Vec 则是其中的一种词嵌入方法,是一种用于生成词向量的浅层神经网络模型,由Tomas M…

spring boot学习第二十篇:使用minio上传下载文件获取文件路径

先安装好minio&#xff0c;参考&#xff1a;window10安装minio-CSDN博客 1、pom.xml文件添加依赖&#xff1a; <!-- 操作minio的java客户端--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.…

C语言:ifswitch分支语句

目录 前言 一、if语句 1.1 if 1.2 else 1.3 嵌套if 1.4 悬空else问题 二、switch语句 2.1 if语句和switch语句的对比 2.2 switch语句中的default 前言 C语⾔是结构化的程序设计语言&#xff0c;这里的结构指的是顺序结构、选择结构、循环结构&#xff0c;C语言是能够实…

大模型之战-操作数据表-coze

工作流直接操作数据库啦【何时可以直接访问自己的数据库呢】 1&#xff0c;第一步创建一个bot智能体 1.1&#xff0c;bot中创建数据库表&#xff1a; 1.2&#xff0c;智能体可以通过对话&#xff0c;操作表&#xff1b;【增加&#xff0c;筛选查询等】 1.2.1&#xff0c;增加…

视频美颜SDK与直播美颜工具的开发详解与技术优化

本篇文章&#xff0c;小编将为开发者提供一份详细的美颜指南。 一、视频美颜SDK的核心功能 视频美颜SDK是一种嵌入式软件开发工具包&#xff0c;允许开发者在应用中轻松实现实时美颜效果。其核心功能主要包括&#xff1a; 1.实时磨皮 2.美白功能 3.瘦脸与大眼 4.智能滤镜…

链式结构二叉树的应用

一、求二叉树节点的个数 思路1&#xff1a;将一棵二叉树分成根节点和它的左右子树&#xff0c;其左右子树又可以分成根节点和左右子树&#xff0c;运用函数递归的方式统计根节点的数量&#xff0c;将根节点的数量相加。 比如这颗二叉树&#xff0c;1是根节点&#xff0c;size&…

自闭症表现的全方位解读

自闭症&#xff0c;一种神经发育障碍&#xff0c;影响着许多儿童和家庭的生活。了解自闭症的表现对于早期诊断、干预和支持这些孩子至关重要。 自闭症的表现形式多样&#xff0c;且在不同个体之间可能存在较大差异。社交互动障碍是自闭症的核心症状之一。自闭症儿童往往在与人建…

【软件测试面试题】WEB功能测试(持续更新)

Hi&#xff0c;大家好&#xff0c;我是小码哥。最近很多朋友都在说今年的互联网行情不好&#xff0c;面试很难&#xff0c;不知道怎么复习&#xff0c;我最近总结了一份在软件测试面试中比较常见的WEB功能测试面试面试题合集&#xff0c;希望对大家有帮助。 建议点赞收藏再阅读…

《机器学习数据标准化》—— 0~1归一化 和 Z标准化

文章目录 1、为什么要数据标准化2、常用的两种数据标准化1、0~1归一化2、Z标准化 3、注意事项 1、为什么要数据标准化 主要是基于以下几个方面的原因&#xff1a; 消除量纲影响&#xff1a;在机器学习中&#xff0c;不同的特征往往具有不同的量纲和单位。例如&#xff0c;身高…

DHT11温湿度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.工作时序 3.起始信号与响应信号 4.读数据时序 5.DHT11数据格式 三、程序设计 main.c文件 dht11.h文件 dht11.c文件 四、实验效果展示 五、资料获取 项目分享 一、介绍 DHT11是一款含有已校准数字信号输出的温湿度复合传感器&…

commvault学习(9):备份mysql(linux平台)

1.全备份 1.1创建实例 在centos7上安装完带有mysql组件的cv客户端后&#xff0c;就能在CS上看到客户端的mysql选项 右击图中mysql&#xff0c;点击所有任务-新MySql Server 在弹出的配置框中进行如下设置&#xff1a; *服务器名&#xff1a;类似任务名&#xff0c;自行设置即…

基于SpringBoot的论坛系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

伊朗通过 ChatGPT 试图影响美国大选, OpenAI 封禁多个账户|TodayAI

OpenAI 近日宣布&#xff0c;他们已经封禁了一系列与伊朗影响行动有关的 ChatGPT 账户&#xff0c;这些账户涉嫌利用该 AI 工具生成并传播与美国总统选举、以色列 – 哈马斯战争以及奥运会等相关的内容。 OpenAI 表示&#xff0c;这些账户与一个名为 “Storm-2035” 的秘密伊朗…