【JVM】类加载机制:分析与验证

news2024/9/25 23:11:49

一、加载

  • 将类的字节码载入方法区中,内部采用 C++ 的 instanceKlass 描述 java 类。它的重要 field 有:
    • _java_mirror : java 的类镜像,例如对 String 来说,就是 String.class,作用是把 klass 暴露给 java 使用
    • _super :父类
    • _fields :成员变量
    • _methods :方法
    • _constants :常量池
    • _class_loader :类加载器
    • _vtable :虚方法表
    • _itable :接口方法表
  • 如果这个类还有父类没有加载,先加载父类
  • 加载和链接可能是交替运行的

注意

  • instanceKlass 这样的【元数据】是存储在方法区(1.8 后的元空间内),但 _java_mirror 是存储在堆中
  • 可以通过前面介绍的 HSDB 工具查看

在这里插入图片描述

二、链接

1)验证

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

  • 修改 Verify.java 的魔数:将 cafebabe 修改为 cafebaby

    在这里插入图片描述

  • 解释执行结果:类格式错误

    PS F:\software\IDEA\JavaProjects\JvmTest\target\classes\org\example\classLoading\link> java Verify
    Error: A JNI error has occurred, please check your installation and try again
    Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1128351301 in class file Verify
            at java.lang.ClassLoader.defineClass1(Native Method)
            ...
    

2)准备

为 static 变量分配空间,设置默认值

  • JDK 7 之前:static 变量 存储于 instanceKlass 末尾
  • JDK 7 开始:static 变量 存储于 _java_mirror(类.class对象) 末尾
  • 注意:final 类型的 static 变量
    • 基本类型常量、字符串常量:编译阶段值就确定了,赋值操作在本阶段完成
    • 引用类型常量:赋值操作在 初始化阶段 完成

3)解析

将自己在其他类的常量池中的符号引用解析为直接引用

类A没有解析为直接引用

public class Analysis{
    public static void main(String[] args) throws IOException {
        //1.访问类A的静态变量(基本类型、字符串)不会导致类A的初始化(解析)
        System.out.println(A.a);
        System.in.read();
    }
}
class A{
    final static int a=1;
    static int b=1;
    static {
        System.out.println("init");
    }
}
  1. 运行程序

  2. 执行命令行命令,查看当前进程id

    PS F:\software\IDEA\JavaProjects\JvmTest> jps
    13816 Analysis
    ...
    
  3. 进入 jdk 安装目录,执行命令打开 HSDB工具

    F:\software\Java\jdk1.8.0_333>java -cp ./lib/sa-jdi.jar sun.jvm.hotspot.HSDB
    
  4. 将 HSDB工具 链接到当前进程

    在这里插入图片描述

  5. 找到 Analysis 类的常量池,查看类A的引用

在这里插入图片描述

类A解析为直接引用

public class Analysis{
    public static void main(String[] args) throws IOException {
        //2.访问类变量导致初始化
        System.out.println(A.b);
        System.in.read();
    }
}
class A{
    final static int a=1;
    static int b=1;
    static {
        System.out.println("init");
    }
}
  1. 运行程序

  2. 执行命令行命令,查看当前进程id

    PS F:\software\IDEA\JavaProjects\JvmTest> jps
    4768 Analysis
    ...
    
  3. 进入 jdk 安装目录,执行命令打开 HSDB工具

    F:\software\Java\jdk1.8.0_333>java -cp ./lib/sa-jdi.jar sun.jvm.hotspot.HSDB
    
  4. 将 HSDB工具 链接到当前进程

    在这里插入图片描述

  5. 找到 Analysis 类的常量池,查看类A的引用

    在这里插入图片描述

三、初始化

1)<cinit>()V 方法

初始化即调用 <cinit>()V ,虚拟机会保证 <cinit>()V 的线程安全

2)发生的时机

导致类初始化的情况:

  • main 方法所在的类
  • new
  • 首次访问类的 静态变量、静态方法
  • 子类初始化,如果父类还没初始化
  • Class.forName(String)

不会导致类初始化的情况 :

  • 类加载器的 loadClass 方法 :加载阶段
  • Class.forName(String,false) :加载阶段
  • 创建该类的数组不会触发初始化 :加载阶段
  • 访问 类.class :加载阶段
  • 访问类的 静态常量(基本类型和字符串) :链接-准备阶段

验证:导致类初始化的情况

public class Init {
    static {
        //1.main方法所在类。首先被初始化
        System.out.println("1.init:main方法所在类");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        //2.new
        A newTest=new A();
        //3.子类初始化
        //4.访问类的 静态变量、静态方法
        int a=B.b;
        //5.Class.forName(String)
        Class.forName("org.example.classLoading.link.D");
    }
}
class A{
    static {
        System.out.println("2.init:new的类");
    }
}
class B extends C{
    static int b=1;
    static {
        System.out.println("4.init:访问类的静态变量、静态方法");
    }
}
class C{
    static {
        System.out.println("3.init:子类初始化");
    }
}
class D{
    static {
        System.out.println("5.init:Class.forName(String)");
    }
}
1.init:main方法所在类
2.init:new的类
3.init:子类初始化
4.init:访问类的静态变量、静态方法
5.init:Class.forName(String)

验证:不会导致类初始化的情况

public class Init {
    public static void main(String[] args) throws ClassNotFoundException {
        ClassLoader classLoader = Init.class.getClassLoader();
        //1.类加载器的 loadClass 方法 :加载阶段
        classLoader.loadClass("org.example.classLoading.link.A");
        //2.Class.forName(String,false) :加载阶段
        Class.forName("org.example.classLoading.link.A",false,classLoader);
        //3.创建该类的数组不会触发初始化 :加载阶段
        A[] arr=new A[2];
        //4.访问 类.class :加载阶段
        Class<A> clazz = A.class;
        //5.访问类的 静态常量(基本类型和字符串) :链接-准备阶段
        int a=A.a;
    }
}
class A{
    static final int a=1;
    static {
        System.out.println("init A");
    }
}
Process finished with exit code 0

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

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

相关文章

直播预约|Flink + StarRocks 实时数据分析新范式

11月 26-27 日&#xff0c;Apache Flink &#xff08;以下简称 Flink&#xff09;社区官方技术大会 Flink Forward Asia 2022 将在线举行&#xff0c;聚集国内外一线厂商围绕 Flink 生态的生产实践经验进行分享。 本次大会上&#xff0c;StarRocks 将于 27 日 中午现身实时湖仓…

CSRF 漏洞学习笔记

什么是 CSRF 漏洞 CSRF&#xff08;Cross Site Request Forgery&#xff0c;跨站请求伪造&#xff0c;也叫 XSRF&#xff09;漏洞是由于未校验请求来源&#xff0c;导致攻击者可在第三方站点发起 HTTP 请求&#xff0c;并以受害者的目标网站登录态&#xff08;cookie、session…

ImmunoChemistry艾美捷自噬试验,红色解决方案

ImmunoChemistry艾美捷ICT的自噬测定&#xff0c;红色使研究人员能够检测和监测活细胞中自噬的体外发育。自噬探针是细胞渗透性的&#xff0c;插入自噬体和自溶体的脂质膜时发出红色荧光。可以使用流式细胞仪读取结果。 自噬是一种保守的溶酶体循环过程&#xff0c;细胞通过该过…

Linux——文件描述符(fd)与重定向、dup/dup2

目录 一.文件描述符 &#xff08;一&#xff09;.含义 &#xff08;二&#xff09;.使用 &#xff08;三&#xff09;.标准输入/输出/错误 二.重定向与dup/dup2 &#xff08;一&#xff09;.dup/dup2 &#xff08;二&#xff09;.重定向 一.文件描述符 &#xff08;一…

MCE | 淀粉样蛋白沉积或是阿尔茨海默症发展“驱动者”

近日&#xff0c;Cell 在线发表的论文 “Spatial Transcriptomics and In Situ Sequencing to Study Alzheimer’s Disease” 中&#xff0c;研究团队在 AD 小鼠模型中&#xff0c;利用空间转录组学研究淀粉样斑块周围直径 100 μm 的组织结构域的转录变化&#xff0c;证明了丰…

Web(二)html5基础-文档头部(知识训练和编程训练)

web知识训练_html5_文档头部标签及属性 web编程训练_html5_文档头部 第1关_页面标题及字符集的设置 <!DOCTYPE html> <html> <head><!-- ********* Begin ********* --><meta charset"utf-8"><title>设置标题</title>&…

《传统文化典藏馆》前端模板

一个基于多种插件的前端二次开发——弘扬中华传统文化的前端模板&#xff0c;内容丰富&#xff0c;可做学习前端技术使用。 主要技术实现&#xff1a;HTML、CSS、JavaScript 下载链接&#xff1a; 弘扬中华传统文化前端模板-Javascript文档类资源-CSDN下载《传统文化典藏馆》…

图像分割 - 分水岭算法

目录 1. 介绍 2. 分水岭算法的实现 距离变换 连接连通分量 3. 代码 1. 介绍 图像是由x&#xff0c;y表示的&#xff0c;如果将灰度值也考虑进去的话&#xff0c;那么一幅图像需要一个三维的空间去表示。 这样就可以把x&#xff0c;y轴比作大地&#xff0c;将灰度值的z轴…

产品流程图设计

一个产品设计之初&#xff0c;必先从流程图做起&#xff0c;流程图可以用来表达产品各式各样的流程&#xff0c;好的流程图&#xff0c;可以快速让整个团队熟悉理解业务&#xff0c;并优化业务。 一、常用的流程图图标含义 流程图通常由起止框、处理框、流程线、判断框、输出输…

使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

HummerRisk V0.5.2:升级对象存储、云检测、云审计和K8s资源态势等

HummerRisk V0.5.2发布&#xff1a;对象存储增加风险检测和操作、云检测支持七牛云、操作审计支持 AWS&#xff0c;提升 K8s 资源态势&#xff0c;并支持在线/离线升级漏洞库。 感谢社区中小伙伴们的反馈&#xff0c;你们的认可是我们前进的动力。 HummerRisk 保持高速的迭代…

Web App、Hybrid App、Native App 横向对比

移动端的开发方式三分天下&#xff1a;纯原生&#xff08;Native App&#xff09;、混合开发&#xff08;Hybird App&#xff09;、网页应用&#xff08;Web App&#xff09;。 纯原生&#xff08;Native App&#xff09;&#xff1a;是在 Android、iOS 等移动平台上利用提供的…

2023第三届中国数字化人才国际峰会

会议背景 中商产业研究院预测&#xff0c;2022年我国数字经济规模将增至48.9万亿元&#xff0c;数字经济在GDP中的比重将超过40%。随着中国经济数字化转型不断深入的同时&#xff0c;数字化人才缺口却近1100万。中国信息通信研究院发布的《数字经济就业影响研究报告》指出&…

数学统计:均值、标准差、方差、协方差

均值:均值描述的是样本集合的中间点,它告诉我们的信息是很有限的。 标准差:标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前…

蓝牙运动耳机什么品牌性价比高,六款值得推荐的运动耳机分享

音乐是运动健身的伴侣&#xff0c;两者合在一起就能让运动变得更加有劲。运动耳机怎么选&#xff0c;想要找到一款不错的运动耳机&#xff0c;首先一定要牢固舒适&#xff0c;其次防水性能越高越好&#xff0c;最后音质偏低音&#xff0c;如果在户外跑步的话&#xff0c;放着大…

Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)

需要源码请点赞关注收藏后评论区留言并且私信~~~ 一、使用okhttp下载图片 okhttp不但简化了HTTP接口的调用过程&#xff0c;连下载文件都变得简单了&#xff0c;对于一般的文件下载&#xff0c;按照常规的GET方式调用流程&#xff0c;只要重写回调方法onResponse&#xff0c;在…

C++:指针:void*指针(跳跃力未定的指针)

先分享一段代码&#xff0c;觉得很有意思 #include<iostream> void* say_hello(void* args){std::cout<< "Hello world"<< std::endl;return 0; } 上面这段代码&#xff0c;我们看到函数的返回值类型竟然是 void* ,形参也是 void* &#xff0c…

限时开源,一份“扭转乾坤”的与时俱进的1700页Java八股文

今天在某客看到一个程序员自述&#xff0c;内容如下&#xff1a; 人到三十&#xff0c;公司效益不好被裁员&#xff0c;两个月时间面了三十几家&#xff0c;一直不是很顺利&#xff0c;面试问八股&#xff0c;根本答不上来。前期不信邪&#xff0c;正常投简历正常面试&#xf…

如何借助现有股票量化交易平台编写策略和回测分析

每个交易日的股票都会上涨或者下跌&#xff0c;在这个过程中笔者们偶尔会想针对部分股票进行股价的涨跌幅进行监控&#xff0c;或者自动进行交易&#xff0c;在这个需求前提下&#xff0c;现有券商、股票分析软件都会带有机器人自动交易策略功能&#xff0c;大部分都需要收费或…

web网页大作业——基于HTML+CSS+JavaScript制作摄影之家网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…