JVM运行时数据区总结以及对形象的内存布局

本文详细介绍了Java内存模型中的各个区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区及直接内存的作用与特点。同时,深入探讨了对象创建的过程,包括类的加载验证、内存分配、初始化等关键步骤。
部署运行你感兴趣的模型镜像

一,数据区

1)程序计数器,线程私有,也就是一个线程对应一个程序计数器,它的作用是为线程指示指令的地址,唯一没有规定OutOfMemoeyError的区域。

2)java虚拟机栈,线程私有,也就是一个线程对应一个栈,线程在调用方法和执行完方法的时候分别对应入栈和出栈的过程,因为是栈的数据结构,非常适合方法调用这样的后进先出的方式,每一个方法对应一个栈帧,栈帧主要有局部变量区(保存局部变量和参数)和操作数栈(方法执行运算过程的中间结果)。

3)本地方法栈,线程私有,类似于java虚拟机栈,只是这里对应Native方法的调用。

4)java堆:非线程私有,存放对象实例和数组的数据区,-Xms,-Xmx控制最小和最大。

5)方法区:非线程私有,存放类信息,常量,符号引用,静态变量,JIT编译的代码。

当中方法区包括一个叫做运行时常量池的数据区,对应Class文件的常量池,放字面量(字符串和final定义的常量)和符号引用,一般解析出来的直接引用也存放在运行时常量池。

6)直接内存:在堆保存一个地址,地址指向堆外的内存,javaNIO有可能会用到,能显著提升性能。

二,创建对象

1,是否加载:当线程遇到一个new指令的时候,会在运行时常量池查看这个对象所属类是否被加载,如果没有会执行响应的加载,验证,准备等过程,如果加载了就可以跳过这个步骤。

2,分配内存,这里注意线程先是在事先定好的内存上分配,当不够的时候才进行相应的扩展,这是为了多线程分配内存的安全性,还有就是虚拟机根据内存是否连续来分配,例如老年代串行gc和并行gc采用的标记整理算法,内存是连续的,而并发gc是标记清除gc,内存是不连续的。

3,将分配的内存空间初始化零值。

4,执行紧跟在new指令后面的init指令进行字段的初始化。

三,对象的内存布局

对象包含(运行时数据和类型指针(表示属于哪个类)),对象头,对象数据,对齐填充。

hotspot的对象定位:先冲栈上的reference数据指向堆中的对象,对象的对象头中的类型指针指向方法区中的对象类型数据。

 

您可能感兴趣的与本文相关的镜像

Qwen3-14B

Qwen3-14B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值