当前位置: 首页 > news >正文

JVM类加载全过程

Java虚拟机类加载的全过程,即加载,验证,准备,解析,初始化

一、加载

加载 是 类加载过程中的一个阶段, 有以下三部分组成

1)通过一个类的全限定名来获取定义此类的二进制流

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3)在堆中生成一个代表这个类的Java.lang.class对象,作为程序访问 2) 方法区中这个类的各种数据的接口

二、验证

验证是连接的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》

因为class不一定有Java编译出来,用0,1敲出class文件也可以的,这会危害虚拟机,所以必须检验。

三、准备

准备阶段是正式为类中定义的变量,即静态变量,被static修饰的变量; 分配内存并设置类变量初始值的阶段。

首先颠覆三观一下,很多资料都说静态变量存储在方法区,但实际上在JDK7之后,静态变量会随着class对象一起存放在Java堆中。 

强调一点: 实例变量不会分配内存, 实例变量会在对象实例化时随着对象一起分配在Java堆中。

        这个时候只记录一个域信息

其次分配完之后初始值通常是数据类型的零值。

public static int value = 123;

这个变量在准备阶段过后的初始值是0而不是123,因为这时尚未开始执行任何Java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器<clinit>()方法中,所以把value赋值为123的动作要到类的初始化阶段才会被执行。注意:此时依然没有实例变量啥事。

还有一种情况Final:

public static final int value = 123;

编译时Javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为123。

给出结果:final修饰的静态变量是基础数据类型或者是字符串常量时,在准备阶段就会完成赋值操作。

当然,如果为final修饰的是静态变量是引用类型,如Object,Integer等,就无法在准备阶段赋值,需要等到初始化阶段。

四、解析

解析阶段是Java虚拟机将常量池内的符号引用替换为直接引用的过程

符号引用:一组符号描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可

直接引用: 可以是直接指向目标的指针,相对偏移量这些精确定位到内存的引用。跟内存相关很大。

五、初始化

类的初始化阶段是类加载过程的最后一个步骤,

初始化阶段就是执行类构造器<clinit>()方法的过程。

(1)<clinit>()方法是由编译器自动收集类中的所有静态变量和静态语句块(static{ }块)中的语句合并而成的。编译器收集的顺序是由语句在源文件中出现的顺序决定,静态语句块只能访问到定义在静态语句块之前的变量,定义在他之后的变量,在前面的静态语句块可以赋值,但不能访问。

(2)<clinit>()方法与类的构造函数(虚拟机视角的实例构造器<init>())不同,它不需要显示调用父类的构造器,Java虚拟机会保证子类的<clinit>()方法执行前,父类的<clinit>()方法已经执行完毕。

(3)父类先执行也意味着父类中定义的静态语句块要优先于子类的变量赋值操作。

(4)<clinit>()方法不是必须的,如果类没有静态语句块,或者需要为变量赋值的操作,编译器可以不为这个类生成<clinit>()方法。

以上具体例子参考《深入理解JAVA虚拟机》

补充几点:下面红字很重要

(1)主类(main()所在类)会被首先初始化, 只有主类调用其他非主类的变量,方法,非主类才会进行初始化

原因在于要节省开销

(2)首次访问这个类的静态变量或者静态方法才会发生初始化

(3)子类访问父类静态变量,只会触发父类初始化

   

可以看到类B并未发生初始化为静态变量赋值,因为静态常量已经在准备阶段赋值了。

 

加载阶段就把class对象 放在堆中了,用以作为接口

 

 

相关文章:

JVM类加载全过程

Java虚拟机类加载的全过程&#xff0c;即加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化 一、加载 加载 是 类加载过程中的一个阶段&#xff0c; 有以下三部分组成 1&#xff09;通过一个类的全限定名来获取定义此类的二进制流 2&#xff09;将这…...

Uniapp安卓原生插件开发Demo

文章目录 前言一、安装开发工具二、导入uni插件原生项目三、开发Module四、开发Component五、合并原生代码到uniapp项目中总结 前言 当HBuilderX中提供的能力无法满足App功能需求&#xff0c;需要通过使用Andorid/iOS原生开发实现时&#xff0c;可使用App离线SDK开发原生插件来…...

Axure的安装与基本使用

目录 一.Axure是什么 二.Axure安装 2.1 一键式安装 2.2 汉化 2.3 授权登录 三.Axure的界面介绍及基本使用 3.1 菜单栏的使用 3.2 工具栏的使用 3.3 页面概要的使用及组件的使用 3.4 组件的样式设计 一.Axure是什么 Axure是一个流行的交互式原型设计工具&#xff0c;一般是…...

分布式锁实现方案 - Lock4j 使用

一、Lock4j 分布式锁工具 你是不是在使用分布式锁的时候&#xff0c;还在自己用 AOP 封装框架&#xff1f;那么 Lock4j 你可以考虑一下。 Lock4j 是一个分布式锁组件&#xff0c;其提供了多种不同的支持以满足不同性能和环境的需求。 立志打造一个简单但富有内涵的分布式锁组…...

[虚拟机]使用VM打开虚拟机电脑重启解决方案。

问题&#xff1a;打开虚拟机点击启动后&#xff0c;电脑会自动重启。&#xff08;WINDOWS10 20版本&#xff09; 解决步骤&#xff1a; 1、对Windows功能进行操作。 上图三个启用。 上图一个取消。 再次打开后&#xff0c;不报警&#xff0c;显示下图问题&#xff1a; 继续解…...

Linux 详细介绍strace命令

system call(系统调用)是程序向内核请求服务的一种编程方式&#xff0c;strace是一个功能强大的工具&#xff0c;可以跟踪用户进程和 Linux 内核之间的交互。 要了解操作系统如何工作&#xff0c;首先需要了解系统调用如何工作。操作系统的主要功能之一是为用户程序提供了一个…...

【知识分享】__RS485-嵌入式常用的通信协议

目录 前言 一、RS485简介 什么是串口 什么是串行通信 什么是并行通信 二、接口原理 1. 连接方式 2. 差分信号 三、485通讯接口的优势 1. 接口电平低&#xff0c; 不易损坏芯片。 2. 传输速率高 3. 抗干扰能力强 4. 传输距离远&#xff0c;支持节点多。 四、常见…...

Qt生成动态链接库并使用动态链接库

项目结构 整个工程由一个主程序构成和一个模块构成(dll)。整个工程的结构目录如下 Define.priMyProject.proMyProject.pro.user ---bin ---MainProgrammain.cppMainProgram.proMainProgram.pro.userwidget.cppwidget.hwidget.ui ---MathDllMathDll.proMathDll.pro.userMyMath.…...

E4990A 阻抗分析仪,20 Hz 至 10/20/30/50/120 MHz

01 E4990A 阻抗分析仪 20 Hz 至 10/20/30/50/120 MHz 产品综述&#xff1a; E4990A 阻抗分析仪具有 20 Hz 至 120 MHz 的频率范围&#xff0c;可在宽阻抗范围内提供出色的 0.045%&#xff08;典型值&#xff09;基本准确度&#xff0c;并内置 40 V 直流偏置源&#xff0c;适…...

k8s volumes and data

Overview 传统上&#xff0c;容器引擎(Container Engine)不提供比容器寿命更长的存储。由于容器被认为是瞬态(transient)的&#xff0c;这可能会导致数据丢失或复杂的外部存储选项。Kubernetes卷共享 Pod 生命周期&#xff0c;而不是其中的容器。如果容器终止&#xff0c;数据…...

万宾科技智能水环境综合治理监测系统效果

水环境综合治理是一项旨在全面改善水环境质量的系统工程。它以水体为对象&#xff0c;综合考虑各种因素&#xff0c;通过科学规划和技术手段&#xff0c;解决水环境污染、生态退化等问题&#xff0c;核心理念是“统一规划、分步实施&#xff1b;标本兼治&#xff0c;重在治本&a…...

掌控安全 暖冬杯 CTF Writeup By AheadSec

本来结束时发到了学校AheadSec的群里面了的&#xff0c;觉得这比赛没啥好外发WP的&#xff0c;但是有些师傅来问了&#xff0c;所以还是发一下吧。 文章目录 Web签到&#xff1a;又一个计算题计算器PHP反序列化又一个PHP反序列化 Misc这是邹节伦的桌面背景图什么鬼&#xff1f;…...

jQuery-操作DOM

使用jQuery操作DOM dom : 文档对象模型 就是HTML元素 $() 函数的2个用法: 用法1:放入一个字符串(选择器)表示获取元素 例如 $("p") $("#abc") $(".del") 用法2:放入一个函数&#xff0c;表示文档就绪函数 例如 $(function(){代…...

高级网工在Linux服务器抓包,少不了这几条常用的tcpdump命令。

Linux 的命令太多&#xff0c;tcpdump 是一个非常强大的抓包命令。有时候想看线上发生的一些问题&#xff1a; nginx 有没有客户端连接过来…… 客户端连接过来的时候 Post 上来的数据对不对…… 我的 Redis 实例到底是哪些业务在使用…… tcpdump 作为网络分析神器就派上用场…...

Hough算法数学原理

直线的极坐标方程&#xff1a; x x 0 r cos ⁡ θ x x_0 r\cos \theta xx0​rcosθ y y 0 r sin ⁡ θ y y_0 r\sin \theta yy0​rsinθ x cos ⁡ θ x 0 cos ⁡ θ r cos ⁡ 2 θ x \cos \theta x_0 \cos \theta r \cos^2 \theta xcosθx0​cosθrcos2θ y sin ⁡ θ…...

基于Debain安装 Docker 和 Docker Compose

一、安装Docker # 先升级一下系统 (Ubuntu / Debian 系) sudo apt-get update sudo apt-get upgrade# 如果你是 CentOS、红帽系列则使用&#xff1a; yum update yum upgrade# 安装 Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh二、Dock…...

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效的处理任何大小项目的版本管理。 核心功能&#xff1a; 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外&#xff0c;其他都无脑安装 3、检查一下安装情况 win…...

q2-qt-多线程

是的&#xff0c;Qt框架中提供了专门用于线程池的API。Qt的线程池API位于QtConcurrent命名空间下&#xff0c;以及QThreadPool类中。 QtConcurrent命名空间提供了一些高级的API&#xff0c;可以方便地使用线程池来执行并行任务。其中&#xff0c;QtConcurrent::run()函数可以用…...

指针,函数指针,二级指针,指针传参,回调函数,指针步长

文章目录 指针是什么&#xff1f;指针的定义指针的大小 指针类型指针有哪些类型&#xff1f;指针类型有什么意义&#xff1f;代码演示&#xff1a;(偏移)代码演示(指针解引用时取出的字节数)其他例子 野指针野指针的成因如何避免野指针 指针运算指针整数指针-指针指针的关系运算…...

StringUtils.isEmpty()方法过期的替代方法

1、问题概述&#xff1f; 今天在准备使用StringUtils.isEmpty()工具判断字符串是否为空的时候&#xff0c;突然发现idEmpty上出现了横线&#xff0c;这就表示这个方法可以实现但是已经过期了&#xff0c;官方不推荐使用了。 原因其实是因为有人给官方提交了一个问题&#xff…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...