虚拟机类的初始化过程(一)

二、虚拟机系统初始化 虚拟机系统初始化 阅读详情

上篇文章我们学习了 Class 文件的结构,现在来看下虚拟机是如何加载 Class 文件的?以及Class 文件中的信息进入到虚拟机后会发生什么样的变化?

虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是 Java 虚拟机的类加载机制.

我们知道,java 语言和其他在编译期就进行连接的语言不同(例如c),它是在运行期间进行加载、连接和初始化工作的,这虽然会增加类加载的性能消耗,但是为java语言提供了高度的灵活性,例如动态绑定(多态).

类加载时机

类从被加载到虚拟机内存开始,到卸载出内存为止,一共经历了7个阶段,加载、验证、准备、解析、初始化、使用、卸载。

其中验证、准备、解析这三部分被统称为连接。

其中,加载、验证、准备、初始化和卸载这5阶段的顺序是确定的,必须严格按照这个顺序来,而解析阶段在某些情况下可以在初始化阶段之后再开始,这是为了支持java语言的动态绑定。注意的是,上面那5个阶段只是按部就班的开始,并不是按部就班的“进行”或“完成”,强调这一点是因为这些阶段通常都是互相交叉地混合式进行的,通常会在一个阶段执行的过程中调用、激活另一个阶段。

什么情况下需要开始类加载过程的第一个阶段:加载了? Java 虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,虚拟机规范则是严格规定了有且只有5种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始):
1.遇到 new、getstatic、putstatic、invokestatic 这4 条字节码指定时,如果类没有进行初始化,则需要先触发其初始化.
场景:比如 new 一个实例、读取或设置一个静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外),或调用一个静态方法
2.使用反射包下的方法对类进行反射调用时
3.当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化
4.当虚拟机启动时,用户需要指定一个执行的主类(包含 main 方法的类),虚拟机会先初始化这个主类
5.当使用JDK1.7的动态语言支持时,如果一个 MethodHandle 实例最后的解析结果 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化.

上面的 5 种场景被称为主动对一个类进行初始化.

接口的加载过程与类加载过程稍有一些不同,针对接口需要做一些特殊说明:接口也是有初始化过程的,这点与类一样,上面的代码都是由 static 来输出初始化信息的,而接口中是不能使用 static{} 语句块的,但编译器任然会为接口生成一个 类构造器,用于初始化接口中所定义的成员变量.

接口的初始化与前面所讲的类的初始化有区别的是第三种,一个类在初始化的时候,要求父类全部都已完成初始化,但是一个接口在初始化的时候,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量)才会被初始化.

Java类的加载过程是什么? 本文将学习类的加载过程,java命令将class文件放到类加载器中,那么之后经历了什么?本文将对其进行学习。 阅读详情

相关推荐

从AND到XOR:5种门控电路在PrimeTime中的检查策略差异

本文深入探讨了AND、NAND、OR、NOR和XOR五种门控电路在PrimeTime静态时序分析中的检查策略差异。重点解析了XOR门控因其非单调性而无法被工具自动推断,需要工程师手动配置的特殊性,并提供了针对各类门控的配置模板与调试技巧,以确保时钟网络的完整性与芯片设计的可靠性。

rgv2345678的博客 270

虚拟机安装与初始化配置

虚拟机安装与初始化配置

J2514545645的博客 2162

ArcGIS实战:地形湿度指数(TWI)计算全流程解析

本文详细解析了ArcGIS中地形湿度指数(TWI)的计算全流程,从DEM数据获取、填洼处理到水流方向与汇流累积量计算,最终实现TWI的精准计算。通过实战步骤指导,帮助读者掌握水文建模和土壤湿度预测的关键技术,适用于农业规划、生态研究等领域。

weixin_29231725的博客 869

学习笔记一:VMware配置虚拟机centos并初始化

VMware虚拟机配置网络创建虚拟机vmvare网络配置宿主机网络配置宿主机网络配置虚拟机内配置 创建虚拟机 vmvare网络配置 打开虚拟网络编辑器,查看当前VMnat8的子网地址,以及子网掩码,之后更改本机的适配器 宿主机网络配置 打开控制面板,编辑vmnet8这个适配器,使里面子网和子网掩码与VMware里的一致 宿主机网络配置 点击单台虚拟机,配置网络适配器为vmnet8 虚拟机内配置 开启虚拟机,配置网卡 vim /etc/sysconfig/network-scripts

weixin_43258559的博客 3539

【软件逆向】带壳带反调试找flag教程(VMProtect3.0+X64dbg+ScyllaHide)

【软件逆向】带壳带反调试找flag教程(VMProtect 3.0+X64dbg+ScyllaHide)

zhangjiuding的博客 7510

【智驾与大模型】端到端与多模态大模型的精彩之旅

智驾和大模型的回顾与展望。开头的笔者自述也说了些心窝子话,边缘计算的监管刻不容缓!

仿生实验室:从0到1,制作人脸表情交互机器人,记录过程,软硬件全部开源,与君共襄盛举! 1319

VM安装虚拟机及初始化操作

对安装好的VMware进行网络配置,方便虚拟机连接网络,本次设置建议选择NAT模式,需要宿主机的Windows和虚拟机的Linux能够进行网络连接,同时虚拟机的Linux可以通过宿主机的Windows进入互联网。7.保证Linux系统ifcfg-ens33文件中IP地址、虚拟网络编辑器地址和Windows系统VM8网络IP地址相同。按如上格式修改IP信息(地址,网关,DNS服务器),修改完毕后全部点击确定退出。许可证:ZC10K-8EF57-084QZ-VXYXE-ZF2XF。到此等待系统重启~~~~

qq_37232843的博客 4678

ADI恒流驱动芯片LT3763调试心得(25A恒流驱动)

看似很简单的一个电路,调了好几版硬件,中间还出现过一个插曲,就是电感,我用的是27A,1.5uH的,贴片封装,由于频繁试板,电感来回用热风枪拆了3次,结果上电空载到3A都没有问题,但是以上10A以上,就出现烧LT3763和mos的情况,一连烧了8片,搞得有点怀疑人生,一度觉得我的电路设计有问题,邮件咨询ADI的FAE后,确认电路设计没有问题。1、大功率同步整流的Nmos管都是取不同的型号,就是厂家推荐的主开关管和续流管的型号往往都不一样,这个里面有什么讲究,我没有整明白,暂时也不需要弄明白。

liming98lm的博客 3921

VMWare 虚拟机创建 + 初始化

虚拟机初始化 yum 私有仓库 ip ftp ansible

m0_59267075的博客 2066

【调优】OpenClaw调优之模型(tokens)篇

OpenClaw用户常遇四大痛点:规则被无视、API账单暴涨、低效模型选择、记忆丢失。通过/context list命令可解析上下文组成,包括工作区配置、引导参数限制、系统提示词等关键信息。重点需关注Token消耗来源,如核心配置文件、技能工具说明等,避免静默截断。建议精简非必要内容,优化记忆机制,平衡功能与成本。该分析帮助用户减少无效操作,合理控制API支出。

海兰 991

NLTK中WordNet与同义词处理

通过本教程,学习了如何使用NLTK中的WordNet进行自然语言处理任务。首先介绍了WordNet的基本概念及其在NLTK中的集成使用,接着讲解了如何查找同义词、反义词等词汇关系,并结合实际应用演示了语义相似性计算。这些技能在文本分析、情感分析、信息检索等场景中有广泛应用,可以帮助开发者构建更智能的自然语言处理系统。掌握这些基本操作后,可以进一步探索WordNet的其他高级功能,结合其他NLTK工具进行更复杂的语言分析。

Mr数据杨 473

虚拟机类加载过程

作为资深IT工程师或架构师,了解类在虚拟机中的加载过程是基本功之一。下面来简单分析一下这个过程,首先看一张整体图: 1、加载 类的加载是指将类的class文件读入到内存的过程,并为之创建一个java.lang.Class对象。 具体流程: 1.1 通过一个类的全限定名来获取定义此类的二进制字节流。 1.2将这个字节流...

ditan20061218的博客 206

ScanNetV2 数据集讲解和选择性下载

写在前面的话: 不可转载!!!!!!!!!!!! ScanNetV2一共1.2T,数据太大本文会简单讲解如何下载自己想要的文件,并附上修改后的下载程序 ScanNetV2:http://www.scan-net.org/ 简介 ScanNetV2的作者是斯坦福大学的博士,其团队通过收集RGB-D的视频序列,通过ipad应用加深传感器而收集的,然后视频会被上传到服务器,并被自动重建。然后,视频会被给到亚马逊 Mechanical Turk,将标注工作众包出去。ScanNetV2是RGB-D数据集,.

qq_35781447的博客 2万+

java中什么时候会发生类的初始化

原文章链接:java中什么时候会发生类的初始化 问题: 调用本类的静态方法和变量会导致类初始化! 代码: public class Test { public static void main(String[] args) { System.out.println(Fun.num); } } class Fun { public static int num = 1; static { System.out.println("Fun初始化.

qq_41456651的博客 187

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JVM——虚拟机类加载机制——初始化

类初始化阶段是类加载过程的最后一步,前面的类加载过程中, 除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。 到了初始化阶段,才真正开始执行类中定义的Java程序代码(或者说字节码). 在准备阶段,变量已经赋过一次系统要求的初始值, 而在初始化阶段,则根据程序员通过程序控制的主观设计去初始化类变量和其他资源。 静态语句块中只能访问到定义在静态语句...

Baymax_wyl的博客 275

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化、类加载器的概念、类加载的层级结构、什么是JVM的内存区域划分? 5.JVM中有哪些内存区域? 6.字节码执行引擎、程序计数器? 7.Java虚拟机栈、Java堆内存? 8.tomcat的类加载器体系?【这里放在3.6位置】 1.Java代码是如何跑起来的? 凡是只要接触过Java的基本上都知道Hello World

weixin_46950473的博客 230

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

类的加载过程

例如下面的一段简单的代码 public class HelloLoader { public static void main(String[] args) { System.out.println("我已经被加载啦"); } } 它的加载过程是怎么样的呢? 完整的流程图如下所示

Leon_Jinhai_Sun的博客 114

JVM-运行过程

上面对虚拟机的各个部分进行了比较详细的说明,下面通过一个具体的例子来分析它的运行过程。  虚拟机通过调用某个指定类的方法main启动,传递给main一个字符串数组参数,使指定的类被装载,同时链接该类所使用的其它的类型,并且初始化它们。例如对于程序: class HelloApp {  public static void main(String[] args)  {   System...

iteye_5210的博客 129

java虚拟机类加载_深入理解java虚拟机(七)类加载的时机

Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用。而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢?虚拟机类加载机制是指 虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的Java 类型。与那些在编译器进行连接工作的语言不同,Java 中,类的加载一直到初始化过程都是在运行...

weixin_29421565的博客 133

关于虚拟机加载类的先后顺序测试

有关虚拟机的学习已在近期计划中,书籍已买,但尚未进行.今天准备研读spring的事务相关源码,随即复习了一下相关知识.看到一位前辈在github上的代码,非常有意思,特记下笔记,以供学习和后期复习: public class DataSourceFactory { private static final BasicDataSource dataSource = new Ba...

weixin_30299709的博客 171

类(型)的生命周期--装载、连接、初始化、卸载

[url]http://bhsc.happy.blog.163.com/blog/static/10438955220091141454918/[/url] 当java需要某个类的时候要按照下面的步骤执行: 1、加载:查找并加载类的二进制文件。 2、连接:包括验证、准备和解析类的二进制数据 (1)验证:确保被加载类的正确性 (2)准...

xiaobai233的专栏 142

深入理解Java虚拟机——类加载机制概述

一、类加载机制概述 虚拟机把描述类的数据从Class文件加载加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。 ...

小志的博客 1117

类的整体加载过程

类的整体加载过程(类加载机制) Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。与那些在编译时需要进行连接的语言不同,在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略让Java语言进行提前编译会面临额外的困难,也会让类加载时稍微增加一些性能开销,但是却为Java应用提供了极高的扩展性和灵活性,Java天生可以动态扩展的语言特性就是依赖运行期动态加载和动态

m0_67631696的博客 97

java虚拟机加载class的顺序

java虚拟机加载class的顺序 JVM 初始化一般初始化一个类:  1>假如这个类还没有被加载和连接,程序先加载并连接该类。  2>假如该类的直接父类还没有被初始化,则先初始化直接父类。  3>假如类中的初始化语句,则执行这些初始化语句。  初始化语句顺序是先执行:代码块,然后执行变量   [java] view plaincopy 01.public cl

maguanghui_2012的专栏 909

Java虚拟机:类加载

前言最近在学习周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》,在博客上查找补充资料时发现一个相关的很有趣的例子。博客链接: 朱小厮的博客 《Java虚拟机类加载机制——案例分析》 这篇博文对下面这个问题进行了很准确、细致的分析,在下从中收获不少。本篇博文的主要目的并非重复讨论,而是重在对细节做出一点补充,同时加深自己对问题的理解,班门弄斧。如有理解不到位之处,还请各

ecjtusbs的博客 322

【深入Java虚拟机】之三:类初始化

类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静态字段时(被final修饰的,已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法时。 使用Java.lang

兰亭风雨的专栏 1万+
上一篇: Kafka线上环境部署
下一篇: 虚拟机类加载过程(二)
^一剪梅^
博客等级 码龄12年 4粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值