【深入理解Java虚拟机 笔记】Java的类加载过程

2023-05-16

类加载的过程如下图所示:
在这里插入图片描述

一、加载阶段

注意:这里的“加载”阶段是整个“类加载”过程的一个阶段,两个词的含义是不一样的。
这个阶段主要做3件事:
1. 通过类的全限定名获取二进制字节流;
2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;
3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

二、链接阶段

验证

这一步的目的是为了保证加载进来的字节流符合《Java虚拟机规范》的要求,不会造成安全错误。

  • 包括对于文件格式的验证,比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息?

  • 对于元数据的验证,比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?是否出现了不合理的重载?

  • 对于字节码的验证,保证程序语义的合理性,比如要保证类型转换的合理性。

  • 对于符号引用的验证,比如校验符号引用中通过全限定名是否能够找到对应的类?校验符号引用中的访问性(private,public等)是否可被当前类访问?

准备

准备阶段主要是为静态变量分配内存,并为这些变量赋初始值。

这些便变量分配到哪儿了呢?没错,是方法区。

这里需要注意的是:此阶段所赋的初始值并不一定是代码中的的初始化值。
8种基本类型的初值,默认为0;引用类型的初值则为null;常量的初值即为代码中设置的值。
举例1:
public static int love = 520
这种情况下,准备阶段love会被赋值为0;
public static final int love = 520
加了final关键字后,love在准备阶段会被赋值为520。

解析

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

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

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

初始化

初始化阶段主要是对类变量初始化,是执行类构造器的过程。

换句话说,只对static修饰的变量或语句进行初始化。

如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。

如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深入理解Java虚拟机 笔记】Java的类加载过程 的相关文章

随机推荐

  • Linux 动态库的编译和执行

    静态库生成及测试 编码myccso脚本 gcc c Wall I inc src myadd c o myadd o ar rcs libmyadd a myadd o rm o mv libmyadd a lib gcc Wall g I
  • matlab中函数的定义和使用

    在matlab的选择框中的的新建中选择新建函数 xff0c 一般是以 m的文本文件 xff0c 新建后我们可以在里面写入我们的实现函数 xff0c 现在我们给出两个实例看一下 xff0c 分别是简单的求和和Fibonacci sequenc
  • matlab简单绘图plot,subplot

    a1 二维绘图plot的实现 subplot n m x 建立一个m n的绘图区域 xff0c 然后分别在其x 61 1 xff0c 2 xff0c 3 xff0c 4 区域绘制图像 function 61 plot1 x 61 0 0 3
  • python 函数的定义和应用

    1 xff0c 函数定义和使用 xff1a def substract sub a sub b sub res 61 sub a sub b return sub res sub test 61 substract 10 20 print
  • Linux shell中的-d,-f,-e,-n的作用

    1 xff0c d gt dirtionnary 判断目录是否存在 例 xff1a d tmp 返回为真便是 tmp是文件夹目录 2 xff0c e gt exist 判断是否存在 例 xff1a e filename 返回为真表示file
  • 「第四范式」2023届-秋季校园招聘正式启动!

  • Linux下用nginx和naxsi搭建web防火墙

    Linux下用nginx和naxsi搭建web防火墙 Naxsi Naxsi是一个开源 xff0c 高性能 xff0c 地位会规则 xff0c nginx的web应用程序防火墙模块 xff0c 著名的web服务器和反向代理 xff0c 它的
  • 【语义分割】类别不平衡损失函数合集

    在语义分割领域 xff0c 我们会常常遇到类别不平衡的问题 比如要分割的目标 xff08 前景 xff09 可能只占图像的一小部分 xff0c 因此负样本的比重很大 xff0c 导致网络倾向于将所有样本判断为负样本 本文介绍了在数据不平衡时
  • 小张学linux内核:十四. elf文件的加载和进程切换寄存器的保存

    重点关注虚拟内存的切换 xff0c pgd xff0c mm struct start code xff1b 理清楚这三个概念 pgd不是在这里设置的遵循COW xff0c 是在写时缺页中断填充的 start code只是一个段开始的标记
  • linux软中断和系统调用深入研究

    arm软中断模式 arm7种模式 有中断模式 xff0c 但是并没有软中断模式 那么arm的软中断是什么呢 xff1f arm的软中断是arm从用户模式切换到特权模式 xff0c 也就是linux中从用户态切换到内核态的过程 swi命令触发
  • 进程proc文件介绍

    进程proc文件 proc pid 下是每个进程的proc信息 xff0c proc self比较特殊 xff0c 哪个进程打开 xff0c 对应链接到哪个进程 1 xff09 内存相关 status xff1a 进程使用虚拟内存和物理内存
  • Win10系统下安装CAA二次开发程序,VS界面上不出现CAA菜单栏或菜单栏为灰色的

    问题描述 xff1a Win10系统下安装了CATIA CAA V5R19和V4R24两个版本 xff0c 其中V5R19版本安装完成后VS2005中没有出现CAA菜单栏 xff0c V5R24安装完成后VS2008中出现部分集成菜单且为灰
  • 基于Stm32的4G模块实现内网透传通信(代码后附)

    基于Stm32的4G模块实现内网透传通信 一 内网透传即内网映射 xff0c 内网IP端口映射外网连接访问过程的实现 内网透传通信实现过程又有以下几种区别 xff1a 1 xff09 路由器映射 适合自己本地路由有公网IP网络环境 xff0
  • RoboCup智能机器人足球教程(二)

    RoboCup智能机器人足球教程 xff08 二 xff09 运行方式 RoboCup2D仿真平台通过一个服务端 xff0c 若干客户端联系而成 xff0c 同时通过监视器进行画面播放 当启动服务端后 xff0c 客户端通过改写程序内部的c
  • RoboCup智能机器人足球教程(三)

    RoboCup智能机器人足球教程 xff08 三 xff09 实现守门员代码 守门员逻辑实现比较容易 xff0c 但是最好开始的时候画好流程图 xff0c 理顺逻辑 xff0c 守门员一直盯着球 xff0c 当球距离守门员够近的时候 xff
  • 嵌入式工作一年总结

    其实这是去年2017年11月份写的 xff0c 现在想把这个发出来 xff0c 为后来的同学或者迷茫的一些同学的一些建议吧 xff01 刚入行回忆 刚开始进入公司的能力很差 xff0c 可以说什么都不会吧 xff0c wifi拼成wife
  • CVPR 2019 | 旷视研究院提出新型损失函数:改善边界框模糊问题

    全球计算机视觉三大顶会之一 CVPR 2019 xff08 IEEE Conference on Computer Visionand Pattern Recognition xff09 将于 6 月 16 20 在美国洛杉矶如期而至 届时
  • ros中使用opencv处理图像

    cv bridge toCvCopy xff1a ROS下的sensor msgs ImageConstPtr xff0c 和图像压缩类型 xff08 例如 xff1a sensor msgs image encodings RGB8 xf
  • PX4飞行日志分析与.ulg文件格式转换

    文章目录 一 FlightPlot安装及使用二 ulg文件格式转换 xff08 windows环境 xff09 一 FlightPlot安装及使用 span class token number 1 span xff09 下载FlightP
  • 【深入理解Java虚拟机 笔记】Java的类加载过程

    类加载的过程如下图所示 xff1a 一 加载阶段 注意 xff1a 这里的 加载 阶段是整个 类加载 过程的一个阶段 xff0c 两个词的含义是不一样的 这个阶段主要做3件事 xff1a 1 通过类的全限定名获取二进制字节流 xff1b 2