Class加载过程

news2024/11/23 18:32:12

文章目录

  • java解释执行
    • 热点代码编译
  • 类生命周期
    • 加载(Loading)
    • 验证(Verification)
    • 准备(Preparation)
    • 解析(Resolution)
    • 初始化(Initialization)
    • 使用(Using)
    • 卸载(Unloading)
  • lazyloading 懒加载

在这里插入图片描述

java解释执行

一个class文件load到内存之通过java的解释器bytecode intepreter解析,JIT(just in-time compiler)编译器值得是有些代码需要把它编译成为本地代码

java是编译语言还是解释语言?
默认情况是 混合模式=混合使用解释器+热点代码编译

热点代码编译

每个方法都有计数器,循环也有循环的计数器,在发现某个方法循环执行,会编译成本地代码,再次调用时直接用本地的,不用解释器执行

为什么不直接都编译成本地代码?执行效率更高

  • java解释器现在效率也已经很高了,在简单的代码上不亚于编译器
  • 如果有一段代码执行文件特别多,用了各种类库,编译过程会很长

类生命周期

一个类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历七个阶段

加载(Loading)

在加载阶段,Java 虚拟机需要完成以下三件事情:

  • 通过这个类的全限定名来获取此类的二进制字节流。

  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

  • 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。

对于数组类而言,情况有所不同,数组类本身不通过类加载器创建,它是由 Java 虚拟机直接在内存中动态构造出来的。

加载阶段结束后,Java 虚拟机外部的二进制字节流就按照虚拟机所设定的格式存储在方法区之中,在 Java 堆内存中实例化一个 java.lang.Class 类的对象,这个对象将作为程序访问方法区中的类型数据的外部接口。

方法区中的数据存储格式完全由虚拟机实现自行定义,《Java 虚拟机规范》未规定此区域的具体数据结构。

验证(Verification)

验证的目的是确保 Class 文件的字节流中包含的信息符合《Java 虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

  • 文件格式验证:
    验证字节流是否符合 Class 文件格式的规范,并且能被当前版本的虚拟机处理。

  • 元数据验证:
    对字节码描述的信息进行语义分析,以保证其描述的信息符合《Java 语言规范》的要求。

  • 字节码验证:
    通过数据流分析和控制流分析,确定程序语义是合法的、符合逻辑的。

  • 符号引用验证:
    简单来说就是该类是否缺少或者被禁止访问它依赖的某些外部类、方法、字段等资源。此验证校验行为发生在虚拟机将符号引用转化为直接引用的时候,即「解析阶段」中进行。

准备(Preparation)

准备阶段是正式为类中定义的变量(静态变量)分配内存并设置类变量初始值的阶段,从概念上讲,这些变量所使用的内存都应当在方法区中进行分配。

解析(Resolution)

解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程。
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符这 7 类符号引用进行

符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。
符号引用与虚拟机实现的内存布局无关,引用的目标并不一定是已经加载到虚拟机内存当中的内容。
各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须都是一致的,因为符号引用的字面量形式明确定义在《Java 虚拟机规范》的 Class 文件格式中。

直接引用:直接引用是可以直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄。
直接引用是和虚拟机实现的内存布局直接相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经在虚拟机的内存中存在。

初始化(Initialization)

初始化阶段就是执行类初始化代码,类中的静态代码块,构造代码块、构造方法都会执行、静态变量赋予初始值。

使用(Using)

卸载(Unloading)

lazyloading 懒加载

严格上讲应该叫lazyInitializing懒初始化。jvm虚拟机的实现都是用的懒加载,什么时候需要这个类才去加载,并不是说一个jar文件里面有1000个类但是只用到了其中一个类就要把1000个类都加载进来。
jvm规范并没有规定何时加载,但严格规定了什么时候初始化

  • new getstatic putstatic invokestatic 指令(访问类或者接口的静态变量或者对该静态变量赋值,或者调用类的静态方法),访问final变量除外(比如:访问类的final静态常量)
  • java.lang.reflect对类进行反射调用时,比如Class.forName(“xxx”)
  • 初始化子类的时候,父类首先初始化
  • 虚拟机启动时,被执行的主类必须初始化
  • 动态语言支持java.lang.invoke.MethodHandle解析的结果为REF_getstatic REF_putstatic REF_invokestatic的方法句柄时,该类必须初始化
public static void main(String[] args) throws Exception{
//        P p;                        // 无打印      没有new 没有访问不加载不初始化
//        X x = new X();              // P  X       new 子类,先初始化父类
//        System.out.println(P.i);    // 8          final不需要加载类
//        System.out.println(P.j);    // P 9        非final得变量需要加载初始化
//        Class.forName("com.jsonschema.Test$P"); //P  反射调用被加载初始化

        // 无打印 动态加载只加载class,获得class对象,没有执行连接、初始化
        ClassLoader.getSystemClassLoader().loadClass("com.jsonschema.Test$P"); 
    }

    public static class P{
        final static int i = 8;
        static int j = 9;
        static {
        	//静态代码块在类加载时调用,且只调用一次
            System.out.println("P");
        }
    }

    public static class X extends P{
        static {
            System.out.println("X");
        }
    }

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

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

相关文章

并发编程(三)原子性(2)

【 悲观锁与乐观锁 】: 【悲观锁】: 一定会被别人打断;我必须得上锁。synchronized就是悲观锁。 【乐观锁】: 乐观锁又称之为——无锁、自旋锁、CAS 。 厕所里的人认为不会有其他人来上厕所和我竞争。 【举例解释CAS操作】&a…

SOHO帮客户找新品,如何拿到最优价?要不要选择大型机械类产品?

做外贸,无论是贸易公司还是工厂,又或者是SOHO。都有机会帮助客户采购自己主打产品之外的其他产品,有些人就会问,对于客户咨询的新产品,我们本身没有熟悉的供应商,这个时候要怎么去找到好的供货商&#xff1…

世界技能大赛夺冠背后,亚马逊云科技如何培养云计算技能人才?

云计算相关专业的就业前景如何? 人社部数据显示,到2025年我国云计算人才缺口将高达近150万。另一方面,根据艾瑞咨询《中国云计算行业洞察与人才分析》报告,2019年云计算领域人才月均薪酬在1万元以上的占比达93.7%,3万元…

VK3606D抗电机马达干扰直接输出6键触摸芯片,电容式6通道触控检测IC低电平有效,无触摸4秒进入待机模式常用于工控面板/空调/风扇/家电等

VINKA/永嘉微电的VK3606D SOP16是一种具有自动校准功能,低待机电流,抗电压波动等特性的,6按键电容式触摸触控检测IC,适用于温控器,86面板触摸开关,智能家居等抗干扰场所 型号:VK3606D 封装形…

WebGL、GPU硬件加速、GLSL、光栅化

一、介绍 WebGL经常被当成3D API,人们总想“我可以使用WebGL和一些神奇的东西做出炫酷的3D作品”。 事实上WebGL仅仅是一个光栅化引擎,它可以根据你的代码绘制出点,线和三角形。 想要利用WebGL完成更复杂任务,取决于你能否提供合…

CentOS Stream 9 配置静态 IP

系统环境: OS:CentOS Stream 9 CentOS Stream 9 不同于以往版本的 CentOS,没有之前的网络设置相关的命令,如: service network start/restart/status systemctl start/restart/status network设置网卡 IP 的配置文件…

新媒体研究杂志社新媒体研究编辑部新媒体研究杂志2022年第18期目录

本期聚焦 出版学核心期刊自媒体运营状况与其学术影响力关系研究 程海燕;季佳乐; 1-5 理论研究 《新媒体研究》投稿:cnqikantg126.com 网络社群网民情绪感染研究综述 单悦影;祁凯; 6-922 基于CiteSpace的被遗忘权研究综述 徐怡; 10-14 应用研究 …

MCE | RNA 逆转录小提示

Tips 1:防止 RNA 模板的降解毫无疑问,RNA 质量对 cDNA 合成结果会产生重要影响。但 RNA 很脆弱,易于降解。为了保证 RNA 的完整性,我们需要小心又小心,比如在冰上操作,用 RNase-free 的枪头和离心管&#x…

力扣27.移除元素【顺序表】

🙈个人主页:阿伟t 👉系列专栏:【C语言–大佬之路】 🎈今日心语:你所看到的惊艳,都曾被平庸所历练。 前言: 在解题过程中一定要画图进行思考,然后再敲代码。 文章目录移除…

计算属性computed、过滤器定义Vue.filter()

计算属性是为了计算得到一个结果而设计的;放在Vue中computed里面定义:如果我们想在页面上打印一个变量,那就直接“{{变量}}”放在大括号里面,然后变量在data里面定义好初始值,就可以在页面上输出了,比如&am…

策略验证_指标买点分析技法_运用KDJ随机指标选择买点

写在前面: 1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文; 2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》 3. 本系列文章是用来学习技法,文中所得内容都仅仅只是作为演示功能使用 目录 解说 策略代码 结果 解…

tftp服务配置的详细过程,简单快速

主机端编译的Linux内核影像必须有至少一种方式下载到目标板上执行。通常是目标板的引导程序负责把主机端的影像文件下载到内存中。根据不同的连接方式,可以有多种文件传输方式,每一种方式都需要相应的传输软件和协议。 在linux开发中最常用的传输方式为网…

打破汽车零部件企业供应链壁垒,数商云SCM供应链系统实现一体化采购协同

随着疫情反复,包括芯片在内的关键零部件短缺,以及原材料成本和物流费用飙升,使得零部件企业利润大幅压缩甚至亏损。当前,在亚洲、欧洲、北美等地,国际零部件厂商正迎来一波“破产潮”,汽车零部件企业举步维…

数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)

目录 4.1.树 4.2.二叉树 4.2.1.概述 4.2.3.存储结构 4.2.3.遍历 1.逻辑简介 2.代码示例 4.1.树 树,由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构。树需要满足以下条件: 任何结点的子节点不相交。任何子结点只有一个父节点。N个结点&am…

carsim 2020 安装说明及多个版本冲突问题解决

在E盘新建一个文件夹,命名为Carsim 2020在Carsim 2020文件夹中,再新建两个文件夹,分别命名为carsim 2020.0_Data和carsim 2020.0_Prog以管理员的身份运行Setup_CarSim_2020.0_r125554.exe,并将安装目录分别选择第2步中的carsim 20…

【LeetCode每日一题:1742. 盒子中小球的最大数量~~~Map+遍历模式+计数】

题目描述 你在一家生产小球的玩具厂工作,有 n 个小球,编号从 lowLimit 开始,到 highLimit 结束(包括 lowLimit 和 highLimit ,即 n highLimit - lowLimit 1)。另有无限数量的盒子,编号从 1 到…

如何设置网络访问 SQL Express?

网络访问 SQL Express 安全和连接SQL Server 配置Windows 防火墙配置连接服务器一旦在本地计算机上设置了 SQL Express,就可以允许网络成员进行远程连接。有不同的方法可以做到这一点,这些步骤可能不适用于现有的网络环境或身份验证方法。下面是在本地计算机上设置的 SQL Ser…

语音前处理技术在会议场景中的应用及挑战

编者按: 随着在线会议的普及,用户已经不再满足于能听到,而是要有更为极致的听感体验,如何能够在复杂多变的应用场景中依旧保证声音清晰流畅是对会议系统的极大挑战。LiveVideoStackCon2022上海站大会邀请到了全时 音视频研发部经理…

网页大作业代码自取【HTML+CSS制作美味糖果网站】

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

【2015】408联考数据结构真题整理

2015 1 题目 答案:A 解析 2 题目 解析 3 题目 解析 4 题目 解析 5 题目 答案:D 解析 6 题目 解析 7 题目 答案:A 解析 8 题目 答案:C 解析 9 题目 解析 10 题目 解析 11 题目 解析 41 题目 答案: 3&a…