面试官:Java类是如何被加载到内存中的?

news/2024/10/6 1:58:38/文章来源:https://www.cnblogs.com/xieshijie/p/18283701

面试连环call

  1. Java类是如何被加载到内存中的?
  2. Java类的生命周期都有哪些阶段?
  3. JVM加载的class文件都有哪些来源?
  4. JVM在加载class文件时,何时判断class文件的格式是否符合要求?

类生命周期

一个类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备、解析三个部分统称为连接

类的生命周期

  • 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按步就班地开始,
  • 解析阶段顺序则不固定,它可以在初始化之前,而在某些情况下也可以在初始化阶段之后,这是为了支持Java语言的运行时绑定特性

类加载过程

系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析

img

加载

加载是类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情

  • 通过一个类的全限定名来获取其定义的二进制字节流
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  • Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。

java_jvm_classload_1

加载.class文件的方式

  • 本地文件系统中直接加载
  • 通过网络下载.class文件
  • zip,jar等归档文件中加载.class文件
  • 从专有数据库中提取.class文件
  • Java源文件动态编译为.class文件

链接

验证

确保被加载的类的正确性

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

  • 文件格式验证(Class 文件格式检查)
  • 元数据验证(字节码语义检查)
  • 字节码验证(程序语义检查)
  • 符号引用验证(类的正确性检查)

验证阶段示意图

准备

为类的静态变量分配内存,并将其初始化为默认值

  • 这时候进行内存分配的仅包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在Java堆中。
  • 这里所设置的初始值通常情况下是数据类型默认的零值(如00Lnullfalse等),而不是被在Java代码中被显式地赋予的值。

基本数据类型的零值

注意:JDK 7 之前,HotSpot 使用永久代来实现方法区的时候,类变量所使用的内存都应当在 永久的 中进行分配。 而在 JDK 7 及之后,HotSpot 已经把原本放在永久代的字符串常量池、静态变量等移动到中,这个时候类变量则会随着 Class 对象一起存放在 Java 堆中。

解析

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

解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符 7 类符号引用进行

  1. 符号引用
  • 符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可
  1. 直接引用
  • 直接指向目标的指针(比如,指向Class类型、类变量、类方法的直接引用可能是指向方法区的指针)
  • 相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)
  • 一个能间接定位到目标的句柄

类的初始化

当一个JVM在启动之后,其中可能包含的类非常多,是不是每个类都会被初始化呢?答案是否定的。

JVM对类的初始化是一个延迟机制,当一个类在首次使用的时候才会被初始化,在同一个运行时package下,一个Class只会被初始化一次。

《Java虚拟机规范》则是严格规定了有且只有6种情况下必须立即对类进行初始化(而加载、验证、准备自然需要在此之前开始)

  1. 通过new关键字会导致类的初始化

  2. 访问类的静态变量,包括读取和更新会导致类的初始化

  3. 访问类的静态方法,也会导致类初始化

  4. 初始化子类会导致父类被初始化

  5. 对某个类进行反射操作。会导致类被初始化

  6. 启动类,就是执行main函数所在的类会导致该类被初始化

注意:构造某个类的数组时并不会导致该类的初始化

参考内容

  • 《深入理解 Java 虚拟机》

  • 十分钟搞懂Java类加载

  • Java 类加载机制

  • 类加载过程详解

  • JVM:类加载过程

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

招募贴 | 第四期自动驾驶OS开发初阶营报名开启

招募贴 | 第四期自动驾驶OS开发初阶营报名开启 第四期国家智能网联汽车创新中心自动驾驶OS开发初阶训练营将于2024年7月22日开营,现已开启报名,诚邀对自动驾驶底层软件开发感兴趣的学员加入,一起驶入自动驾驶的快车道,共同探索未来的无限可能。从训练营能学到什么? 训练营…

STM32L073RZT 调试SPI问题

现象描述: spi通信一次后,第二次通信spi的SR寄存器异常0xFF31(MODF, CRCERR, RXNE),通信失败。 以下为调用流程及相关代码:NFC_ID(); NFC_REG_B_TEST();//SPI 读 void SPI_Read_Data(uint8_t* w_data, uint32_t w_size, uint8_t* r_data, uint32_t r_size) {SET_SPI_CSS(G…

Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享

本书从一个系统化的视角,秉承大道至简的主导思想,介绍Spark中最值得关注的内 容,讲解Spark部署、开发实战,并结合Spark的运行机制及拓展,帮读者开启Spark技术之旅。 Spark大数据处理:技术、应用与性能优化(全)PDF下载 Spark已经在全球范围内广泛使用,无论是Intel、Yahoo…

LaTeX 编辑协作平台 Overleaf 安装和使用教程

在学术界和科技行业,LaTeX 已成为撰写高质量文档的标准工具。然而,传统的 LaTeX 使用体验常常伴随着以下挑战:学习曲线陡峭 环境配置复杂 多人协作困难 实时预览不便当然,市面上不乏很多在线 LaTeX 编辑平台,但它们大多是封闭的商业服务,无法完全满足用户对数据隐私和自主…

半个月6次面试,终于进百度HR面了

和大家分享一下来自粉丝的面经投稿,他在最近半个月内疯狂的面试,光百度就约面了两个岗位,一共进行了6场面试,并且其中一个进到了 HR 面。今天和大家分享一下来自粉丝的面经投稿,他在最近半个月内疯狂的面试,光百度就约面了两个岗位,一共进行了6场面试,并且其中一个进到…

使用钉钉Oauth2授权登录Odoo配置

准备工作 需要用到的模块: Odoo/auth_oauth OCA/server-auth/auth_oidc 因为钉钉的Oauth授权流程比较特殊,需要继承改造res.users上的几个方法 models\res_users.pyclass ResUsers(models.Model):_inherit = "res.users"dingtalk_userid = fields.Char(Dingtalk Us…

推荐一款Win11主题WPF UI框架

最近在微软商店,官方上架了新款Win11风格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,这款应用引入了前沿的Fluent Design UI设计,为用户带来全新的视觉体验。最近在微软商店,官方上架了新款Win11风格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,这款应用引入了前沿的…

图论总结

重链剖分 树上修改,查询路径信息之类的 最多经过logn个轻边, 这样可以更好地划分 注意点: 修改边权可以转化到点权上面: 注意lca的位置不要修改, 应该是update(id[y]+1,id[x]) 例题: 轻重边: https://www.luogu.com.cn/problem/P7735 判断是不是重边,信息转化到点上面,…

logstach 8.6.2输出到mongo 6

logstach官网下载:https://www.elastic.co/cn/downloads/past-releases 1、查看logstach有没有自带输出到mongo的插件,到logstach安装目录/bin下cd /data/logstash-8.6.2/bin/ ./logstash-plugin list --verbose2、没有自带输出到mongo的插件就安装./logstash-plugin install…

模拟集成电路设计系列博客——8.4.3 数控振荡器

8.4.3 数控振荡器 在之前的章节中,我们介绍了一种简单得基于LC振荡器得数控振荡器方式,通过开关控制谐振电路中的电容值实现数控频率方式。 另一种更直接的利用模拟PLL中的LC振荡器VCO的方式是直接通过DAC的方式将数字码转换成模拟量,然后对电容施加控制。值得一提的是这种压…

android 性能优化 -systrace

简介: Systrace允许监视和跟踪Android系统的行为(trace)。它会指明系统都在哪些工作上花费时间、CPU周期都用在哪里,甚至可以看到每个线程、进程在指定时间内都在干嘛。它同时还会突出观测到的问题,从垃圾回收到渲染内容都可能是问题对象,甚至提供建议的解决方案。但是不能…

故地重游

近来,种种原因让我总觉得对任何事都失去了兴趣,整个人犹如失去灵魂的躯壳一般。一切都在往前走,但我想更快一些却无能为力,比较稳定的环境也就注定了过程的时长,又没有改变当下的勇气,每每思量心猿四起,无法自拔。本诗在故地重游(初到京第一工作地)所做,一步步走在那…