超详细对象分配过程

本文深入探讨了Java对象在JVM中的详细分配过程,包括字节码文件、类加载器的工作原理,以及类加载的三个阶段。同时,讲解了TLAB在Eden区的作用,以及堆内存中的Eden和Old区的区别。此外,还阐述了栈帧结构,特别是局部变量表和操作数栈的功能,以及PC寄存器在程序执行中的角色。
摘要由CSDN通过智能技术生成

我们顶峰见

宏观

   今天决定写一篇干货满满的文章,“对象的详细分配过程”。:该图片原本是高清的,但是我无法复制进来,所以只能截图放进来了。
在这里插入图片描述

微观

   根据上方图所展示的区域,一个一个进行介绍。

字节码文件

   字节码文件是javac将java文件编译后的文件,俗称“.class”字节码文件,而为什么要编译成字节码文件呢?原因是因为要被JVM(Java虚拟机)所识别并且还要满足JVM的规范,才可以被执行。

JVM的规范有哪些呢?简单举例:例如字节码的格式:魔数、类版本、常量池、类的标识符、类索引父索引接口索引、属性表等等,要满足这些规范。

类的加载器

   类的加载器分为三种:BootstrapClassLoader(引导类加载器)、ExtClassLooader(扩展类加载器)、AppClassLoad(系统类加载器),而加载类文件的时候,又分为三步骤:加载、链接、初始化。
在这里插入图片描述

类加载的三步骤
加载:加载阶段实际上是将字节码文件加载到机器内存中,并在内存中构建出java类的原型----类模板对象。
链接区验证阶段:验证阶段分为:格式验证、字节码检查、符号引用验证等,主要是防止类文件对程序存在可以攻击以及验证字节码是否符合规范。
链接区准备阶段:准备阶段是为类变量分配内存,并将其初始化。
链接区解析阶段:解析阶段是将类、接口、字段等的符号引用,转换为直接引用(指向实际的对象地址)。
初始化:初始化最重要的工作则是执行类的初始化方法:<cinit>方法,而<cinit>的组成是由java编译器收集类的静态成员赋值动作以及static语句块等,并且注意<cinit>只会被执行一次,当多个线程执行的时候,只能被一个线程加载,而其他线程是直接获取加载后的信息。

类的加载器介绍
BootstrapClassLoader(引导类加载器):由C#、C++所编写,负责加载sum开头、java开头包下面的类。
ExtClassLooader(扩展类加载器):由java语言编写,负责加载\jre\lib\ext目录下的类。
AppClassLoad(系统类加载器):由java语言编写,负责加载用户自定义的类。

TLAB

   每个线程的私有独享区域,其内存只有Eden区的1%,并且tlab存储在eden区中,这个实际上属于栈上分配,也可以理解为临时缓存区,最终目的只是为了存储小的对象,当TLAB区域内存够用时,则直接存储在TLAB,这样当线程访问对象的时候可以直接在TLAB里面获取对象,而如果TLAB内存不够时,只能存储在Eden区或old区。

Eden和Old

   Eden和Old是新生代和老年代,是属于堆内存中的两大区域,简单理解:生命周期短的对象都存储在Eden区,而生命周期长的对象或大对象都存储在Old区,对于该区域,我后续会更新一篇“GC文章”来详细描述这两个区域。

   应该都听过“栈管运行,堆管内存”吧?但是栈真的不存储数据吗?不,栈也是会存储数据的,但只是临时数据。一个Java程序对应一个进程,一个进程包含多个线程,每个线程都有自己私有的栈,而栈中存储着栈帧,栈帧又分为:局部变量表、操作数栈等,栈的大小由栈帧们决定。

栈帧结构
局部变量表:局部变量表,也可以称为是本地变量表,存储着当前方法的变量、形参信息(类型、符号引用地址)。
操作数栈:内部结构类似于栈,主要用于保存变量计算的中间结果,可是视为一个临时的存储点。
动态链接:在操作过程中将符号引用转换为调用方法的直接引用,属于栈帧内部的转换。
方法返回地址:当当前栈帧执行完成之后,会返回一个执行下一项的地址,由PC寄存器存储。

注:对于局部变量表或操作数栈可通过Jclasslib进行查看,也可以查阅到操作指令等。

在这里插入图片描述

PC寄存器

   程序计数器(Program Counter Register),也又名"程序钩子",其作用是存储指向下一条操作指令的地址,也就是即将要执行的操作指令,由执行引擎读取并执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值