面试题:Java 类加载过程是怎么样的?

首先,我们编写好的Java代码,经过编译变成.class文件,然后类加载器把.class字节码文件加载到JVM中,接着执行我们的代码,最后将类卸载出JVM。而从类加载到虚拟机到卸载出虚拟机的这一整个生命周期总共可以分为7个步骤,分别为加载、验证、准备、解析、初始化、使用和卸载,其中验证、准备和解析又称为连接阶段。接下来简单介绍下各个阶段是干嘛的。

加载是“类加载”的第一个阶段,就是将需要用到的类对应的.class字节码文件加载到虚拟机内存,并在方法区中生成一个java.lang.Class对象,作为程序访问这个类的各种数据的访问入口。

public class Test {
    public static void main(String[] args) {
        User user = new User();
    }
}

看一下上面这段代码,经过编译会生成两个字节码文件Test.class和User.class,接着会将包含main方法的这个类加载到虚拟机内存中开始执行,当执行到User user = new User(),发现需要用到User类,就会将User.class加载到内存中。所以简单的说,当需要用到哪个类时,就回去加载哪个类,Java的自带的核心类会在虚拟机启动时就会加载,包括包含main方法的启动类。但其实,类加载也挺复杂的,只是我了解的也不深,目前就理解成这样吧,后面再深入研究。

第二阶段验证,从字面上就可以看出这个阶段是来校验加载进来的.class文件中的内容是否符合规范,毕竟编译成.class文件后还是可以人为的对这个文件进行修改,那如果改的乱七八糟,压根不符合虚拟机的规范,那虚拟机就没法执行了,所以说这一步还是比较关键的。至于如何验证,还没有研究。

准备阶段我引用《深入理解Java虚拟机》中的一句话:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这也比较好理解,看下面一段代码:

public class Test {
    public static int value = 10;
}

当需要用到这个类时,会先将这个类加载到内存中,并验证字节码文件的合法性。验证通过后就会进行准备工作了,会为这个类中的类变量分配内存空间,就是上面的value变量,并给一个初始值。

注意,仅包括类变量,不包括实例变量和局部变量等,并且只是给一个初始值,int型的初始值是0,所以准备过后,value的值是0,而不是10,而真正赋值为10是在初始化阶段。我还在其它资料上看到,这一阶段也会给这个类分配内存空间,先给类分配内存,在给它里面的类变量分配内存。

解析阶段是将常量池中的符号引用替换为直接引用的过程,这一部分内容我还没搞懂,所以这里就不过多记录了,简单了解一下。

初始化阶段是类加载中核心的一步了,还是以上面的代码为例,准备阶段我们已经为value变量分配了内存空间并给了初始值,现在就是真正给value赋值的时候,把10赋给了value。如果类中还含有静态代码块,也会在这一阶段执行。这里还要一点要注意,初始化类的时候,如果父类还没加载和初始化,也会触发父类的加载和初始化。

使用就没什么好说了,初始化完就可以开始使用这个对象了。

卸载是类的生命周期中的最后一阶段,即将方法区中无用的类回收,而类需要同时满足下面3个条件才算无用的类:

  • 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
  • 加载该类的ClassLoader已经被回收。
  • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

同时满足上述3个条件的类即可回收,但不一定就会回收,可通过参数配置。

下面用一张图来简单展示类的加载流程:

在这里插入图片描述
以上就是Java类的加载过程,当然,只是简单的说明了一下,刚接触,还是有很多地方不清楚,先大概有一个这样的印象,后面再慢慢深入理解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊注册账号时老是显示内部错误

最近你们是否遇到注册亚马逊账号时一直遇到"内部错误"的情况?,这可能是由多种原因引起的。以下是一些可能有助于解决这个问题的步骤: 1、清除缓存和Cookie:有时浏览器缓存和Cookie中的问题可能导致网站错误。可以试试清…

高速公路安全监测预警系统的功能优势

实时监测和预警:高速公路安全监测预警系统能够实时监测高速公路的路基、桥梁、隧道等结构的位移变化情况,并通过数据分析及时发出预警,有效预防和减少交通事故的发生。 高精度测量:高速公路安全监测预警系统能够实现高精度的位移…

2023CSPS 种树 —— 二分+前缀和

This way 题意: 一开始以为是水题,敲了一个二分贪心检查的代码,20分。发现从根往某个节点x走的时候,一路走来的子树上的节点到已栽树的节点的距离会变短,那么并不能按照初始情况贪心。 于是就想着检查时候用线段树…

Docker系列---【mysql容器手动停止后,重启服务器,mysql容器被删掉了,如何恢复mysql数据?】...

mysql容器手动停止后,重启服务器,mysql容器被删掉了,如何恢复mysql数据? 1.问题描述 为了快速搭建数据库,我使用了docker搭建数据库,由于服务器资源紧张,我想先把mysql容器停掉,启动…

讯飞输入法13.0发布,推出行业首款生成式AI输入法

🦉 AI新闻 🚀 讯飞输入法13.0发布,推出行业首款生成式AI输入法 摘要:科大讯飞在2023年全球开发者节上发布了全新讯飞输入法13.0版本,其中最大的亮点是推出了行业首款生成式AI输入法。这次升级将生成式AI能力融入输入…

Maven 生命周期clean default size含义

clean 负责清理工作,清理上一次项目构建产生的一些文件,如编译后的字节码文件,打包后的jar包文件 default 整一个项目构建的核心工作,如编译,测试,打包,安装,部署等等 size 生成报告…

《健康界》深度报道:阿基米德医疗设备精细化管理,助力降本增效

“给我一个支点,我就能撬动整个地球。”古希腊著名物理学家阿基米德两千多年前的这句“狂言”,让杠杆原理广为流传并被普遍接受,成为力学的基本原理之一。 在今天的苏州,有一家叫苏州阿基米德网络科技有限公司(下称阿…

opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox

文章目录 0、前言1、网络介绍1.1、输入1.2、Backbone主干网络1.3、Neck1.4、Prediction预测输出1.4.1、Decoupled Head解耦头1.4.2、Anchor-Free1.4.3、标签分配1.4.4、Loss计算 1.5、Yolox-s、l、m、x系列1.6、轻量级网络研究1.6.1、轻量级网络1.6.2、数据增强的优缺点 1.7、Y…

【编程技巧】VS调整过程中如何快速跳出循环及如何跳到指定代码段

1.如何快速跳出循环 现在这个循环有128次,每次都进去就需要很多时间去调控,我们可以直接修改i的值: 这样就可以直接跳出循环体了 2.跳到指定代码段 如图,目前调试的位置在46行,我想让他直接跳到61行,有两种…

虹科 | 解决方案 | 非道路移动机械诊断方案

虹科Pico汽车示波器为卡车、拖拉机、叉车、船只、联合收割机、挖掘机开发了专用的测试附件和软件测试菜单,比如 24 V 电池、Bosch Denoxtronic、J1939 通信、发动机和液压传动系统以及部件测试等。我们为从事重型车辆和非道路移动机械的维护与诊断的朋友&#xff0c…

qwen大模型,推理速度慢,单卡/双卡速度慢,flash-attention安装,解决方案

场景 阿里的通义千问qwen大模型,推理速度慢,单卡/双卡速度慢。 详细: 1、今日在使用qwen-14b的float16版本进行推理(BF16/FP16) 1.1 在qwen-14b-int4也会有同样的现象 2、使用3090 24G显卡两张 3、模型加载的device是auto&#x…

美创科技列为IDC中国数据安全市场代表厂商

近日,国际权威IT咨询机构IDC发布《中国数据安全市场发展趋势,2023》报告,报告针对中国数据安全市场的发展现状进行调研,明确了最终用户数据安全建设的痛点、难点,阐述了市场中各技术服务提供商的服务方案和优势。 美创…

SSM(Spring SpringMVC MyBatis)配置文件信息,完成学生管理页面(前后端全部代码)

效果图&#xff08;elementUI&#xff09; 项目结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sche…

Python深度学习实战-基于tensorflow.keras六步法搭建神经网络(附源码和实现效果)

实现功能 第一步&#xff1a;import tensorflow as tf&#xff1a;导入模块 第二步&#xff1a;制定输入网络的训练集和测试集 第三步&#xff1a;tf.keras.models.Sequential()&#xff1a;搭建网络结构 第四步&#xff1a;model.compile()&#xff1a;配置训练方法 第五…

datahub 中血缘图的实现分析,在react中使用airbnb的visx可视化库来画有向无环图

背景 做大数据的项目&#xff0c;必不可少的是要接触到数据血缘图&#xff0c;它在大数据项目中有着很重要的作用。 之前在公司也做过一些案例&#xff0c;也看过很多友商的产品&#xff0c;阿里的DataWork&#xff0c;领英的Datahub&#xff0c; datawork的血缘图使用的是 G6…

常用Web安全扫描工具汇整

漏洞扫描是一种安全检测行为&#xff0c;更是一类重要的网络安全技术&#xff0c;它能够有效提高网络的安全性&#xff0c;而且漏洞扫描属于主动的防范措施&#xff0c;可以很好地避免黑客攻击行为&#xff0c;做到防患于未然。 1、AWVS Acunetix Web Vulnerability Scanner&a…

066:mapboxGL的marker的drag,dragstart,dragend三种触发事件示例

第066个 点击查看专栏目录 本示例是演示如何在vue+mapbox中处理marker的三种触发事件drag,dragstart,dragend。 marker通过on(‘XXX’, callback),的方式进行触发处理。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(…

树与二叉树(考研版)

文章目录 树与二叉树树的基本概念结点、树属性的描述树的性质 二叉树的概念二叉树的性质二叉树的构建二叉树的遍历先序遍历中序遍历后序遍历层次遍历 递归算法和非递归算法的转换源代码 线索二叉树二叉树的线索化线索二叉树 找前驱/后继 树和森林树的存储 树与二叉树的应用哈夫…

如何处理前端本地存储和缓存?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【MATLAB源码-第57期】基于matlab的IS95前向链路仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 IS-95&#xff0c;也被称为cdmaOne&#xff0c;是第一代的CDMA&#xff08;Code Division Multiple Access&#xff0c;码分多址&#xff09;数字蜂窝通信标准。IS-95的全称是Interim Standard-95&#xff0c;最初由Qualcomm…