JVM——类加载与字节码技术(3)

news2024/11/16 3:39:03

目录

    • 四、类加载阶段
      • 4.1 加载
      • 4.2 链接
      • 4.3 初始化
    • 五、类加载——练习
      • 练习1
      • 练习2

四、类加载阶段

4.1 加载

将类的字节码载入方法区(1.8后为元空间,在本地内存中)中,内部采用 C++ 的 instanceKlass
● _java_mirror 即 java 的类镜像,例如对 String 来说,它的镜像类就是 String.class,作用是把 klass 暴露给 java 使用
● _super 即父类
● _fields 即成员变量
● _methods 即方法
● _constants 即常量池
● _class_loader 即类加载器
● _vtable 虚方法表
● _itable 接口方法

如果这个类还有父类没加载,先加载父类

加载和链接可能是交替运行的

在这里插入图片描述

注意
● instanceKlass这样的【元数据】是存储在方法区 (1.8后的元空间内),但_java_mirror是存储在堆中(类在加载的同时会在堆内存中生成一个java_mirror的对象,如Person类会产生一个Person.class)
● 可以通过前面介绍的HSDB工具查看

4.2 链接

验证:验证类是否符合JVM规范,安全性检查

准备:为static变量分配空间,设置默认值
● static变量在JDK 7之前存储于instanceKlass末尾,从JDK 7开始,存储于_ java_ mirror末尾
● static变量分配空间和赋值是两个步骤,分配空间在准备阶段完成,赋值在初始化阶段完成
● 如果static变量是final的基本类型,那么编译阶段值就确定了,赋值在准备阶段完成
● 如果static变量是final的,但属于引用类型(new对象),那么赋值也会在初始化阶段完成

解析:将常量池中的符号引用解析为直接引用

HSDB的使用
● 先获得要查看的进程ID

jps

● 打开HSDB

java -cp D:\JAVA\JDK8.0\lib\sa-jdi.jar sun.jvm.hotspot.HSDB

● 运行时可能会报错,是因为缺少一个.dll的文件,我们在JDK的安装目录中找到该文件,复制到缺失的文件下即可
在这里插入图片描述

● 定位需要的进程
在这里插入图片描述
在这里插入图片描述

● 未解析时,常量池中的看到的对象仅是符号,未真正的存在于内存中
public class Demo1 {

   public static void main(String[] args) throws IOException, ClassNotFoundException {
      ClassLoader loader = Demo1.class.getClassLoader();
      //只加载不解析
      Class<?> c = loader.loadClass("com.nyima.JVM.day8.C");
      //用于阻塞主线程
      System.in.read();
   }
}

class C {
   D d = new D();
}

class D {

}

● 打开HSDB(可以看到此时只加载了类C)
在这里插入图片描述

查看类C的常量池,可以看到类D未被解析,只是存在于常量池中的符号
在这里插入图片描述

● 解析以后,会将常量池中的符号引用解析为直接引用

可以看到,此时已加载并解析了类C和类D
在这里插入图片描述
在这里插入图片描述

4.3 初始化

初始化阶段就是执行类构造器clinit()方法的过程,虚拟机会保证这个类的『构造方法』的线程安全

● clinit()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的

注意
编译器收集的顺序是由语句在源文件中出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问,如
在这里插入图片描述

发生时机

类的初始化的懒惰的,以下情况会初始化
● main 方法所在的类,总会被首先初始化
● 首次访问这个类的静态变量或静态方法时
● 子类初始化,如果父类还没初始化,会引发(子类联动父类初始化)
● 子类访问父类的静态变量,只会触发父类的初始化
● Class.forName
● new 会导致初始化

以下情况不会初始化
● 访问类的 static final 静态常量(基本类型和字符串)【在准备阶段,static final的常量就已经完成赋值,以后便可直接使用】
● 类对象.class 不会触发初始化(*.class类加载时就会生成mirror对象)
● 创建该类对象的数组(数组会存放在mirror对象中,加载时就会创建)
● 类加载器的.loadClass方法
● Class.forNamed的参数2为false时
● 验证类是否被初始化,可以看改类的静态代码块是否被执行

五、类加载——练习

练习1

从字节码的角度分析,使用a,b,c这三个常量是否会导致类E初始化
结论:a、b不会;c会
在这里插入图片描述

未执行静态代码块( 类E为未进行初始化
在这里插入图片描述

a、b均为静态常量(基本类型与字符串常量),都在类链接的准备阶段进行赋值,并不会导致初始化;而c不为基本类型(包装类型),底层会做自动的装箱操作将基本类型转换为包装类型,虽然前面为静态的但是也不会在准备阶段完成,只能推迟到初始化阶段完成。

练习2

典型应用——完成懒惰初始化单例模式
在这里插入图片描述

以上的实现特点是:
◆ 懒惰实例化
◆ 初始化时线程安全是有保障的

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

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

相关文章

大数据技术架构(组件)10——Hive:集合函数类型转化函数

1.4.3、集合函数1.4.3.1、size select map(a,1,b,2),size(map(a,1,b,2)),array(1,2,3,4),size(array(1,2,3,4));1.4.3.2、map_keysselect map(a,1,b,2), map_keys(map(a,1,b,2));1.4.3.3、map_valuesselect map(a,1,b,2), map_values(map(a,1,b,2));1.4.3.4、array_containssel…

中国国际电子商务中心与易观分析联合发布:2022年3季度全国网络零售发展指数同比增长1.5%

近日&#xff0c;中国国际电子商务中心与易观分析联合发布2022年3季度“全国网络零售发展指数”及其分指数。2022年3季度全国网络零售发展指数同比增长1.5%&#xff0c;环比下降2.9%。随着稳经济一揽子政策和接续措施全面落地显效&#xff0c;生产加快回暖&#xff0c;经济平稳…

vmstat、free、df、iostat、sar

1. vmstat看CPU vmstat -n 2 3 一般vmstat工具的使用是通过两个数字参数来完成的&#xff0c;第一个参数是采样的时间间隔数单位是秒&#xff0c;第二个参数是采样的次数 -procs r:运行和等待CPU时间片的进程数&#xff0c;原则上1核的CPU的运行队列不要超过2&#xff0c;整个…

Softing为Endress+Hauser提供过程自动化连接解决方案

一 背景 恩德斯豪斯&#xff08;EndressHauser&#xff09;是一家总部位于瑞士的过程工业自动化解决方案的全球领军企业&#xff0c;致力于为过程工业及实验室自动化领域提供测量仪器、服务和解决方案。其产品被广泛应用于石油、化工、制药、食品饮料以及废水处理等过程自动化…

银河麒麟V10操控系统Qt安装

下载安装镜像申请试用https://www.kylinos.cn/support/trial.html&#xff0c;根据CPU架构选择要下载的安装包。AMD、Intel的CPU下载银河麒麟桌面操作系统V10 AMD64版本&#xff0c;我下载的Kylin-Desktop-V10-SP1-HWE-Release-2203-X86_64.iso制作系统安装启动U盘下载制作启动…

1. kafka-提高生产者吞吐量

kafka的基础使用知识不在这篇文章阐述&#xff0c;默认读者都会使用 首先kafka的生产者原理&#xff0c;如下。图来自网上 上面的图可能不全&#xff0c; 我再详细描述下&#xff0c;在消息发送过程中&#xff0c;设计到两个线程main和sender线程&#xff1b; &#xff08;1…

Java接口——子接口是否能直接通过子接口名调用父接口类方法

Java9允许在接口中定义默认方法和类方法&#xff0c;为接口增加了一种私有方法&#xff0c;也可以提供实现。 接口就是定义一组通用的方法&#xff0c;就像U盘&#xff0c;只要是USB接口大部分都可以在电脑上使用&#xff0c;电脑无需关心U盘内部怎么实现&#xff0c;只需要告…

浅谈python中@装饰器 - 附例子(含类装饰器与函数装饰器)

浅谈python中装饰器 文章目录浅谈python中装饰器关于装饰器&#xff08;decorator&#xff09;小总结关于&#xff08;语法糖&#xff09;进阶装饰器顺序装饰器 & 参数End提到的使用首先要先讲一下装饰器的概念 关于装饰器&#xff08;decorator&#xff09; 先来看看官方…

计算机相关专业提升学历的解决方案(硕士研究生)

文章目录1、正规全日制硕士1.1 研究生入学考试1.2 硕士毕业要求2、继续教育&#xff08;非全日制&#xff09;2.1 在职研究生2.2 同等学力申硕3、海外硕士3.1 海外硕士申请3.2 中外合作项目1、正规全日制硕士 1.1 研究生入学考试 1、考试报名 官方网站&#xff1a;国家研究生…

玩转PPT 第2节 PPT第一辅助神器iSlide操作

ppt神器 第2节 islide常用操作锦集1 一键优化1.1 统一字体1.2 统一段落1.3 统一参考线1.4 统一主题色2 设计排版2.1 快速复制图形实现矩阵布局2.2 环形布局复制2.3 环形裁剪2.4 矩阵裁剪3 设计工具3.1 对齐3.2 大小3.3 对齐到参考线3.4 选择&#xff0c;相当于快速组合取消等3.…

树与二叉树深度剖析(二)

一. 树表示法1.双亲表示法(1).含义在一棵树中&#xff0c;任意一个结点的双亲只有一个&#xff0c;这是由树的定义决定的。双亲表示法就是利用了树的这个性质&#xff0c;在存储结点信息的同时&#xff0c;在每个节点中附设一个指向其双亲的指针&#xff0c; 指向双亲在链表中的…

IMX Linux 用户手册 — 3

IMX Linux 用户手册 — 3 10.3 CAAM Job Ring后端驱动规范 CAAM作业环后端驱动(caam_jr)实现并使用作业环接口(JRI)向CAAM引擎提交来自前端驱动(caamalg, caamhash, caampkc, caamrng, caamkeyblob)的加密API服务请求。 CAAM驱动程序有几个选项&#xff0c;最显著的是硬件工作…

ssm宿舍水电费报修考勤管理系统的开发与实现

目 录 摘 要 I 目 录 1 第1章 概述 1 1.1 研究背景 1 1.2 研究现状 1 1.3 研究内容 2 第二章 开发技术介绍 2 2.1 系统开发平台 2 2.2 平台开发相关技术 3 2.2.1 B/S架构 3 2.2.2 mysql数据库介绍 4 2.2.3 JSP技术介绍 4 第三章 系…

如何增强企业数字敏捷性?|身份云研究院

在经济下行背景中&#xff0c;企业面临数字化转型和降本增效两大课题&#xff0c;解决这两个问题的核心是增强企业数字敏捷性。比起从业务侧逐个优化&#xff0c;决策者们更应从数字化基础设施入手&#xff0c;搭好底层数字化架构来保障企业在不断变化的技术和法规中获得适应性…

随时随地查看远程试验数据与记录——IPEhub2与IPEmotion APP

一 背景 在工况恶劣、空间狭小的试验场景或工程机械领域中&#xff0c;不但试验人员在试验环境中对自身安全没有保障&#xff0c;而且试验过程也会受到影响&#xff0c;如高温高压测试、工程机械液压系统测试等。对此&#xff0c;结合IPEhub2与IPEmotion APP&#xff0c;既可保…

linux journalctl使用详解

1.概述 ​ journalctl 用来查询 systemd-journald 服务收集到的日志。systemd-journald 服务是 systemd init 系统提供的收集系统日志的服务。journalctl通常用来查询systemd管理的Unit的日志信息。 2.使用方法 $ man journalctl $ journalctl --help 常用方法 $ journalctl …

【可解释性机器学习】解释基于Scikit-learn进行文本分类的pipeline及结果

使用Scikit-learn进行文本分类pipeline1. 基线模型2. 基线模型&#xff0c;改进的数据3. Pipeline改进4. 基于字符的pipeline5. 调试HashingVectorizer参考资料scikit-learn文档提供了一个很好的文本分类教程。确保先阅读它。 本文中&#xff0c;我们将做类似的事情&#xff0c…

学习笔记-----通道

加粗样式# system v共享内存 进程通信的前提条件是&#xff1a;让不同进程看见同一份资源。 共享内存&#xff1a;其实就是进程获取共享区里面的地址&#xff0c;该地址为物理内存中某块我所需要资源的地址(该内存是创建的共享内存处在共享区里)&#xff0c;地址通过页表映射到…

项目工时管理遇难题?看看这套工时管理系统解决方案

随着社会化大生产的发展以及市场竞争的日趋激烈&#xff0c;现代企业的规模在不断扩大。对于项目企业来说&#xff0c;人力资源的成本就是项目的主要成本&#xff0c;而工时是项目中人工成本的重要依据&#xff0c;因此&#xff0c;管理好员工工时是项目管理过程中最重要的任务…

计算机图形学 第3章 圆的扫描转换-第三章结束

书用的是 书名:计算机图形学基础教程&#xff08;VisualC版&#xff09;&#xff08;第二版&#xff09; 定价&#xff1a;44.5元 作者:孔令德 出版社&#xff1a;清华大学出版社 出版日期&#xff1a;2013-03-01 ISBN&#xff1a;9787302297529 目录习题3&#xff08;续&#…