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

【JVM】内存区域划分,类加载的过程,.class文件的格式

一个java写的程序,跑起来就得到了一个java进程,而java进程=JVM+上面运行的字节码指令

JVM是「java虚拟机」,负责解释执行java的指令

【JVM内存区域划分】

1.程序计数器(比较小的空间)

作用:保存了下一条要执行的指令的地址

这里“下一条要执行的指令”是Java的字节码(不是CPU的二进制机器语言)

2.堆

JVM上最大的空间,new出来的对象都在堆上

3.栈

栈中所保存的信息,有函数中的局部变量,函数的形参和函数之间的调用关系

4.元数据区

(以前这个地方也叫作“方法区”)

存放Java程序中的指令(最开始写的Java代码,都是在代码中创建一个一个类,然后给这些类编写一些属性和方法,这些方法被JavaC编译,得到了一些字节码指令),指令都包含在类的方法中

它保存了代码中涉及到的,类的相关信息以及类的static属性

在一个java进程中,元数据和堆只有一份,程序计数器和栈,则可能有多份(当一个Java进程中有多个线程时,每个线程都有自己的程序计数器和栈)

线程就代表一个“执行流”,每个线程就需要保存自己的“程序计数器”,每个线程也需要记录自己的调用关系

【栈帧】

如上文所述,栈是用来保存方法之间的调用关系的

举个例子,代码最开始执行时,调用了一个A方法,此时栈中就会产生一个「A方法的栈帧」,A方法的栈帧里面就会保存一些重要的信息(当前方法的入口地址,方法的形参,方法的局部变量,返回之后继续执行的地址等)

方法A在调用过程中,也许还会调用方法B,此时栈中就会产生一个「B方法的栈帧」,这里也会包含了B方法相关的信息,以此类推

当方法执行完毕后,栈帧会被销毁

当调用新的方法时,栈帧会被创建

因此这是根据代码的流程随时创建随时销毁的

【变量所处的区域】

变量a,b,c,d,e,f都属于哪个内存区域?

一个变量处于哪个内存区域,和变量是不是“内置类型”无关,而是和变量的形态有关

局部变量:栈

成员变量:堆

静态成员变量:元数据区(方法区)

因此:

堆:a,b

栈:e,f

元数据区:c,d

【JVM类加载的过程】

一个Java程序对应一个「.java文件」

javac编译后,可以得到一个「.class文件」

文件会处于硬盘上,在运行java进程时,JVM就需要读取.class中的内容,并且执行里面的指令,.class就是类加载,把类涉及到的字节码从硬盘读取到内存中(元数据区中)

读取完后,就会把这个.class中的指令实现为类对象

加载一个.class文件,也就会对应创建一个类对象,类对象中就包含了.class文件中的各种信息

比如:

类名是什么,类中有哪些属性,每个属性名字是什么 每个属性类型是什么,继承的父类是什么,实现的借口有哪些等等

基于类对象,就可以创建出该类的实例,类对象,其实就是“对象”的说明书/蓝本

【类加载的具体步骤(重点掌握)】

1.加载

把.class文件找到,在代码中先见到类的名字,然后进一步的找到对应的.class文件(涉及一系列目录查找的过程) ,然后打开并读取文件内容

2.验证

验证读到的.class文件的数据,是否正确与合法

在Java标准文档中,明确定义了.class文件的格式是怎么样的

3.准备

分配内存空间

最终需要得到一个类对象,而这需要内存来存放,因此需要分配内存空间,根据刚才读取到的内容,确定出类对象需要的内存空间,申请这样的内存空间,并且把内存空间中所有的内容,都初始化为0

Java中,创建一个内存空间,都会把这个内存空间 全部设为0,后续再进行进一步的初始化

4.解析

主要针对类中的字符串常量进行处理

Java虚拟机将常量池内的符号引用替换为直接引用(初始化常量)

如图所示,在“”.class 文件”中,会有一个空间对应着“s”这个变量,也会有一个「常量池」区域用来存储“s”中“hello”这个字符串常量

也就是说,s变量中保存了“hello”字符串常量的地址

但是在文件中,并不存在“地址”这样的概念。谈到地址就是“内存”的地址,而文件(硬盘)中没有地址的概念

虽然没有地址,但是可以存储一个类似于地址的「偏移量」(从文件开头到“hello”的距离)这样的概念,用来变相描述这个数据的位置

5.初始化

针对类对象做最终的初始化操作,执行静态成员的赋值语句

如果当前加载的类还有父类且父类没有被加载过,那么也会对父类进行加载

【双亲委派模型】

是类加载五个步骤中,第一个步骤中里面的一个环节:给定类的全限定名,找到对应的class文件位置

类加载器JVM中,已经内置了一些类加载器,完成上述的“类加载”过程

JVM默认有三个类加载器:

1.BootstrapClassLoader(负责加载标准库中的类)

2.ExtensionClassLoader(负责加载扩展类)

3.ApplicationClassLoader(负责加载第三方库中的类/自己写的代码中的类)

而「双亲委派模型」是因为这三个类有这样的形象关系:

注意,这里不是Java父类子类这样的继承关系,而是类加载器中有一个parent这样的引用来指向父亲

【双亲委派模型的工作流程】

输入:类的全限定名(字符串),类似于java.lang.String

得到:找到对应的class文件

如果最后也没有找到,会抛出异常“ClassNotFoundException”

为什么这么搞?

防止用户自己写的类,把标准库的类给覆盖掉,保证标准库的类,被加载的类优先级是最高的,扩展库其次,第三方库的优先级最低

【.class文件的格式】

【u4】

4个字节的无符号整数,unsigned int

【u2】

2个字节的无符号整数,unsigned short

【magic】

魔幻数字,计算机圈子中约定俗成的做法,二进制文件中,会在开头的若干个字节,设置一个固定的常熟进去,通过这个常数,标识当前这个文件是什么样的文件

【minor_version和major_version】

确保编译时使用的JDK和运行时使用的JDK版本一致

(低版本JDK编译出的文件在高版本JDK中一般可以运行,但高版本在低版本上无法运行)

【access_flags——interface_count】

描述当前这个类涉及的父类信息和接口信息

【fields_count—末尾】

描述类中的属性和方法,以及额外的属性和方法

相关文章:

【JVM】内存区域划分,类加载的过程,.class文件的格式

一个java写的程序,跑起来就得到了一个java进程,而java进程=JVM上面运行的字节码指令 JVM是「java虚拟机」,负责解释执行java的指令 【JVM内存区域划分】 1.程序计数器(比较小的空间) 作用:保存了下一条…...

esp32-camera入门(基于ESP-IDF)

主要参考资料: ESP32-S2 Kaluga camera lcd 示例入门: https://blog.csdn.net/Marchtwentytwo/article/details/121121028 摄像头应用方案常见问题汇总: https://docs.espressif.com/projects/esp-faq/zh_CN/latest/application-solution/camera-application.html …...

react中类式组件与函数式组件的区别

在React中,类式组件(Class Components)与函数式组件(Functional Components)是两种不同的组件定义方式,它们各有特点,适用于不同的场景。以下是它们之间的主要区别: 一、定义与语法…...

【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…...

【重学 MySQL】五十六、位类型

【重学 MySQL】五十六、位类型 定义赋值与使用注意事项应用场景 在MySQL数据库中,位类型(BIT类型)是一种用于存储位字段值的数据类型。 定义 BIT(n)表示n个位字段值,其中n是一个范围从1到64的整数。这意味着你可以存储从1位到64…...

Centos7 NTP客户端

目录 1. NTP客户端1.1 安装1.2 启动1.3 同步状态异常1.4 更改/etc/chrony.conf配置文件1.5 同步状态正常 1. NTP客户端 1.1 安装 如果chrony没有安装,可以使用以下命令安装 sudo yum install chrony1.2 启动 启动并设置开机自启 sudo systemctl start chronyd …...

手机号归属地查询-手机号归属地-手机号归属地-运营商归属地查询-手机号码归属地查询手机号归属地-运营商归属地

手机号归属地查询API接口是一种网络服务接口,允许开发者通过编程方式查询手机号码的注册地信息。关于快证签API接口提供的手机号归属地查询服务,以下是一些关键信息: 一、快证签API接口简介 快证签API接口可能是一个提供多种验证和查询服务…...

CoppeliaSim和Matlab建立远程连接教程

CoppeliaSim和Matlab建立远程连接教程 Matlab通过调用CoppeliaSim的远程API和库函数实现远程连接,为实现Matlab和CoppeliaSim的联合仿真做准备。 一、获取并查看版本信息 点击 Help 查看版本信息 使用的CoppeliaSim Edu版本为:4.4.0 位数:64bit 二、拷贝API函数和库文件…...

使用STS以及签名URL临时授权访问OSS资源

本文介绍JAVA如何使用STS以及签名URL临时授权访问OSS资源。 注意事项 由于STS临时账号以及签名URL均需设置有效时长,当您使用STS临时账号生成签名URL执行相关操作(例如上传、下载文件)时,以最小的有效时长为准。例如您的STS临时账…...

Next.js 14 使用 react-md-editor 编辑器 并更改背景颜色

1.简介 react-md-editor是一款markdown编辑器,本文介绍如何在Next.js中使用它。 2.安装 安装命令: npm install uiw/react-md-editor3.MD编辑器 markdown编辑器的使用: "use client" import MDEditor from uiw/react-md-edi…...

【Iceberg分析】Spark与Iceberg集成落地实践(一)

Spark与Iceberg集成落地实践(一) 文章目录 Spark与Iceberg集成落地实践(一)清理快照与元数据配置表维度自动清理元数据文件属性手动清理 清理孤岛文件合并数据文件 清理快照与元数据 配置表维度自动清理元数据文件属性 每一次写…...

【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL45

异步FIFO 描述 请根据题目中给出的双口RAM代码和接口描述,实现异步FIFO,要求FIFO位宽和深度参数化可配置。 电路的接口如下图所示。 双口RAM端口说明: 端口名 I/O 描述 wclk input 写数据时钟 wenc input 写使能 waddr input 写…...

【强训笔记】day27

NO.1 代码实现&#xff1a; #include<iostream>using namespace std;int n,m; int main() {cin>>n>>m;long long retn;for(int i0;i<m-1;i)retret*(n-1)%109;cout<<ret<<endl;return 0; }NO.2 思路&#xff1a;bfs遍历实现&#xff0c;dis…...

Nginx06-静态资源部署

零、文章目录 Nginx06-静态资源部署 1、静态资源概述 静态资源&#xff1a;是在Web开发中不经常改变的文件&#xff0c;比如图片、CSS样式表、JavaScript脚本文件等。这些资源通常是预先编译好的&#xff0c;不需要服务器端的动态处理。动态资源&#xff1a;是在Web开发中需…...

MySQL数据库专栏(二)SQL语句基础操作

目录 数据库操作 创建数据库 查看数据库 选择数据库 删除数据库 数据表操作 数据表数据类型 数据表列约束 数据表索引 创建表 查看表 查看表结构 删除表 数据表的增删改操作 …...

【OpenCV 实战】1.手势虚拟拖拽(双手骨骼点识别)

step: 1.opencv 获取视频流 2.在画面上画一个方块 3.通过mediapipe获取手指关键点坐标 4.判断手指是否在方块上 5.若在方块上&#xff0c;方块跟着手指移动 mediapipe网站介绍&#xff1a;Hands - mediapipe (chuoling.github.io) 已上传到GitHub &#xff1a; plumqm/OpenC…...

基于springboot人力资源管理系统源码

项目技术&#xff1a;SpringBoot 运行环境&#xff1a;jdk1.8idea/eclipsemaven3mysql5.6 项目描述&#xff1a; 系统包括&#xff0c;员工管理&#xff0c;奖惩管理&#xff0c;合同管理&#xff0c;薪酬管理&#xff0c;培训管理&#xff0c;绩效评估等功能...

如何使用 Apt-Get 和 Apt-Cache 在 Ubuntu 和 Debian 中管理软件包

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Apt 是 dpkg 打包系统的命令行前端&#xff0c;也是许多发行版中管理软件的首选方式。它是 Debian 及基于 Debian 的 Linux 发行版…...

Linux系统创建新分区并挂载的方法

一、引言 本文以CentOS为例讲述Linux系统创建新分区并挂载的方法。如下图所示&#xff0c;用fdisk -l命令可以看到该CentOS系统下有一个磁盘/dev/vda&#xff0c;其容量为2199G&#xff0c;即2T。该磁盘有两个分区&#xff1a;vda1和vda2&#xff1a; 用lsblk命令可以查看到磁…...

反射第二弹:用注册器动态注册(用自定义的注解标注的)策略,实现策略模式的设计

目录 引言 设计思路: 代码实现: 标注注解:@StrategyClass 扫描注解:trategyScan 注册器抽象类: 动态策略注册类: AOP类: 总结: 引言 曾经有人问我,假如有一个业务或者数据处理逻辑,会根据甲方客户繁杂的业务需求,而动态变化,该怎么处理,具体怎么实现? 将…...

【Xcode Command Line Tools】安装指南

安装指令 xcode-select --install安装 完成安装 验证 $ xcode-select -p /Library/Developer/CommandLineTools...

springboot开发网站-使用redis数据库定时特征限制指定ip的访问次数

springboot开发网站-使用redis数据库定时特征限制指定ip的访问次数。近期网站经常有人恶意访问&#xff0c;提交了很多垃圾信息。为了屏蔽这类灌水帖&#xff0c;打算屏蔽ip地址&#xff0c;限制24小时内只能访问1次某个接口。下面是测试的案例代码内容。 1&#xff1a;首先&am…...

【大模型理论篇】大模型相关的周边技术分享-关于《NN and DL》的笔记

本文所要介绍的一本书《Neural Networks and Deep Learning》&#xff0c;该书作者Michael Nielsen&#xff0c;Y Combinator Research的研究员&#xff0c;是多年之前自己看的一本基础书籍&#xff0c;很适合入门了解一些关于深度学习的概念知识&#xff0c;当然也包含了一些小…...

CSS 圆形边框与阴影

目录 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影...

Bianchi模型、python计算及ns3验证

由于项目与学习需要,最近学习了bianchi模型,并在python中进行了公式->代码的转化,仿真结果与ns3结果对比。 本文更多的是理解模型各个部分的含义、把各个简单的推导过程转化为python、ns3对比: 1 理论吞吐与传输概率、传输成功概率、包长、速率、排队时间、成功传输时…...

SQL常用语法

SQL&#xff08;Structured Query Language&#xff09;是一种用于存储、操作和检索数据库中数据的标准编程语言。以下是一些常用的 SQL 语法&#xff1a; 数据库操作 创建数据库&#xff1a;CREATE DATABASE database_name;删除数据库&#xff1a;DROP DATABASE database_name…...

计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

浏览器前端向后端提供服务

WEB后端向浏览器前端提供服务是最常见的场景&#xff0c;前端向后端的接口发起GET或者POST请求&#xff0c;后端收到请求后执行服务器端任务进行处理&#xff0c;完成后向前端发送响应。 那浏览器前端向后端提供服务是什么鬼&#xff1f; 说来话长&#xff0c;长话短说。我在人…...

文本到语音或视频的构想

₦X8s43Y1iIquVAeF₦ 在Python中&#xff0c;有几个库和模块可以用来实现文本到语音的转换&#xff0c;并且可以生成带有背景音乐的视频。以下是一些可用的库&#xff1a; 1. pyttsx3&#xff1a;这是一个离线文本到语音转换库&#xff0c;它支持多种语音引擎&#xff0c;不依…...

请解释一下数据库的分区和分片?请解释一下数据库的日志和日志的重要性?

请解释一下数据库的分区和分片&#xff1f; 数据库的分区和分片是两种用于提高数据库性能和可扩展性的技术&#xff0c;它们各自具有不同的特点和应用场景。以下是对这两种技术的详细解释&#xff1a; 一、数据库分区 定义&#xff1a; 数据库分区是将一个大型的数据库表或索…...