JVM之类的生命周期

类的生命周期:加载,连接(该阶段比较复杂,可以被分为验证、准备、解析,这三个阶段),初始化(最重要,因为程序员可以干涉),使用,卸载。

 加载:

   第一步:是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息,并存入内存。

   第二步:类加载器在加载完类后,Java虚拟机会将字节码中的信息保存到方法区中。

   第三步:生成一个InstanceKlass对象(这个对象是用c++编写的,Java不能直接操作),保存类的所有信息,里面还包含特点功能,如,多态的消息。

   第四步:同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象(主要用于实现反射,包含了字段,方法和静态字段的数据等)这个堆中的class对象和方法区的InstanceKlass文件互联,可以互相找到彼此。作用是在Java代码中去获取类的消息以及存储静态字段的数据(jdk8及以后)。

  为什么要在堆中复制一份方法区的对象数据信息呢?

因为方法区的Klass文件是c++编写的,Java不能直接操作,且对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中的所有信息。    堆中的Class文件中的字段信息是少于方法区的Klass文件的,因为我们并不需要所有字段信息。

连接:验证、准备、解析

  验证: 验证内容是否满足《Java虚拟机规范》。

     主要验证4部分:

  1、文件格式验证,比如class文件的魔术验证

  2、元信息验证,比如类必须要有父类,不指定则默认为java.lang.object

  3、验证程序执行指令的语义,比如方法中的强行跳转指令。验证指令的正确性。

  4、符号引用验证,例如是否访问了其他类中的private方法等。

  准备:给静态变量分配内存并赋初始值0(不管代码中写的赋值多少,这里int、short、byte赋值0;long赋值0L;double赋值0.0;boolean赋值false;char赋值‘\u0000’;引用类型赋值为null。

final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值。就是不会赋值给默认初始值了。

  解析:将常量池中的符号引用替换成指向内存的直接引用。符号引用就是在字节码文件中使用编号来访问常量池中的内容。

初始化

  执行静态代码块中的代码,并为静态变量赋值。会执行字节码文件中的clinit方法(就是class+init,类初始化)部分的字节码指令。

 导致类的初始化的几种方式:

  1、访问一个类的静态变量或静态方法。注意:变量是final修饰的且等号右边是常量,是不会触发类初始化的。

  2、调用Class.forName(Stirng className)

  3、new一个该类的对象。

  4、执行main方法的当前类。

 clinit指令在特定情况下不会出现,如以后几种:

 1、无静态代码块且无静态变量赋值语句。

 2、 有静态变量的声明,但没有赋值语句。

 3、静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化。

 注意:

  数组的创建不会导致数组中元素的类进行初始化。

  final修饰的变量如果赋值的内容需要执行指令才能得出结果,会执行clinit方法进行初始化。

  复合类的初始化(如继承)

    1、直接访问父类的静态变量,不会触发子类的初始化。

    2、子类的初始化clinit调用前,会先调用父类的clinit初始化方法。

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

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

相关文章

C/C++ 初级球球大作战练手

效果演示&#xff1a; https://live.csdn.net/v/385490 游戏初始化 #include <stdbool.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> #include <algorithm> #include<math.h> #include<mmsy…

java多线程编码应用1——java多线程CompletableFuture使用技巧

在实际项目开发过程中&#xff0c;大部分程序的执行顺序都是按照代码编写的先后顺序&#xff0c;依次从上往下挨个执行的&#xff0c;但是对于统计或者批量操作数据时&#xff0c;是否有更好的方案呢&#xff1f;这时候就可以考虑使用多线程编程&#xff0c;异步并行执行多个任…

嘉楠堪智 CanMV K230 进行 C 语言程序开发

本文记录学习、使用 K230 SDK 进行 C 语言程序开发的一些关键步骤&#xff0c;编写程序源代码&#xff0c;如何编译运行在大核和小核的程序&#xff0c;如何使用 SCons 进行编译。 一、编写代码 在 ubuntu 上创建一个 C 文件 hello.c 并加入如下代码&#xff1a; #include &…

【MATLAB画图】如何绘制图像坐标系

首先我们需要图像坐标轴的原点在左上角&#xff1a; set(gca,ydir,reverse,xaxislocation,top); 然后我们需要坐标轴上加上箭头 quiver(0, 0, 0, 520); % 在(x1, y1)处绘制一个箭头&#xff0c;其方向和长度由(dx, dy)确定 quiver(0, 0, 700, 0); % 在(x1, y1)处绘制一个箭头…

英语新概念2-回译法-lesson13

The Greenwood Boys 绿林少年是一组流行歌手们。现在他们正在参观城市里的所有公园&#xff0c;他们明天就要到这。他们将坐火车到并且大多数小镇上的年轻人将要欢迎他们&#xff0c;明天晚上他们将要在工人俱乐部唱歌。绿林少年将在这待五天&#xff0c;在这期间&#xff0c;…

flowable一对并发网关跳转的分析

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

iptables配置防火墙策略

背景 虚机安全非常重要&#xff0c;防火墙策略是安全中重要一环。常见配置防火墙策略的手段有两种&#xff1a;iptables和firewalld。 iptables是操作系统内置的防火墙配置工具&#xff0c;firewalld是基于iptables的&#xff08;本质firewalld配置生效后还是转化成了iptable…

互联网摸鱼日报(2024-05-07)

互联网摸鱼日报(2024-05-07) 36氪新闻 又是被「三无产品」冠名的五一档&#xff1f; 特斯拉擎天柱已经进厂拣电池了&#xff0c;其他“机器打工人”赶得上吗&#xff1f; 左手收购、右手出海&#xff1a;再战港交所的美的集团急什么&#xff1f; 全国第一&#xff0c;常州是…

前端面试题大合集3----网络篇

目录 一、Http协议详解&#xff0c;http请求方式&#xff0c;http状态码 Http协议详解&#xff1a; http请求方式&#xff1a; http状态码&#xff1a; 常用的状态码&#xff1a; 其他常用状态码&#xff1a; 二、Http常见请求方式 三、Http协议与TCP协议的区别和联系 …

【STM32G474】利用Cpp编写STM32代码后,Cubemx修改配置后代码报错147个error,如何处理?

问题描述 打开Cubemx&#xff0c;添加TIM7用于定时器精准延时&#xff0c;生成代码后&#xff0c;Keil提示有147个error。 之前是Cubemx是没有问题的&#xff0c;是利用Cpp编写stm32&#xff08;将Keil改为Version6&#xff09;后才导致Cubemx配置失败&#xff1a; debug成功…

Mybatis进阶2

Mybatis进阶1-CSDN博客 Mybatis入门-CSDN博客 Mybatis入门2-CSDN博客 我们接下来要学习Mybatis的高级查询 我们先在数据库中准备我们需要的数据表 teacher表 课程表&#xff1a;与教师表是一对多的关系&#xff0c;所以有一个外键字段 学生表 由于学生表和课程表是多对多的…

《Python编程从入门到实践》day22

# 昨日知识点回顾 方法重构、驾驶飞船左右移动、全屏显示 飞船不移动解决&#xff0c;问题出在移动变量x更新 # Ship.pysnipdef update(self):"""根据移动标志调整飞船的位置"""# 更新飞船而不是rect对象的x值# 如果飞船右移的标志和飞船外接…

八股Day2 多线程

Day2 多线程 1.线程和进程的区别&#xff1f; 2.并发和并行的区别&#xff1f; 3.创建线程的四种方式 4.线程的run()和start()有什么区别 5.线程包含哪些状态&#xff0c;怎么变化的 6.新建T1 T2 T3三个线程&#xff0c;如何保证他们按顺序执行 7.Notify和notifyAll区别 8.Sle…

微信小程序Picker组件全面解析:如何优雅处理数组对象选择器【代码示例】

微信小程序Picker组件全面解析&#xff1a;如何优雅处理数组对象选择器【代码示例】 基本概念picker组件简介数组对象与picker 实战例演练数据准备picker配置数据绑定与处理显示选中结果 安全性与性能优化结语与讨论 在微信小程序开发中&#xff0c;picker组件扮演着至关重要的…

射频无源器件之电桥

一. 电桥的定义及作用 电桥主要用于实现微波大功率功放系统的功率合成分配,信号采集等功能,被广泛应用于中国及全球4G/5G基站、5G网络覆盖、北斗导航天线、车载高精度导航(无人驾驶)天线等。可将信号分成有相位差的两路,90度电桥相位差90,180度电桥相位差180。 常说的3d…

Redis学习2——SpringBoot整合Redis,Redis工具类

依赖和配置 pom.xml SpringBoot整合Redis&#xff0c;需要引入spring-boot-starter-data-redis依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>当…

使用poi生成word文件时,zip相关的报错

apache poi-检测到Zip Bomb解决方案_zip bomb detected! the file would exceed the max. -CSDN博客

stm32_RTC_2_HAL——stm32CudeMX

介绍 RTC&#xff08;实时时钟&#xff09;不仅仅提供计数功能&#xff0c;它是一个完整的时钟和日历模块&#xff0c;用于提供日期和时间信息。RTC 能够提供年、月、日、星期、时、分、秒等时间信息&#xff0c;并且通常具有闹钟功能&#xff0c;可以用于定时唤醒或触发事件。…

C++学习第十二天(继承)

1、继承的概念以及定义 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行拓展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#x…

STM32F103学习笔记 | 报错界面及解决方案 | 1.keil5中文注释的横竖(正与斜)问题

文章目录 一、报错界面二、解决方案参考文献 一、报错界面 二、解决方案 打开设置 在打开的设置选项卡中&#xff0c;图中Font显示的是这个软件当前设置的字体&#xff0c;可以看到字体是仿宋&#xff0c;这就是问题出现的原因&#xff0c;将之改成没有的字体就行了。 可以看…