java内存区域

本文详细介绍了Java虚拟机(JVM)的运行时数据区域,包括Java虚拟机栈、本地方法栈、堆和方法区的功能及作用。同时,还探讨了类从加载到运行的全过程,包括装载、链接和初始化等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文为深入了解java虚拟机的读书笔记
我们先来看一下运行时数据区域
这里写图片描述
一.我们来看一下java虚拟机栈,他是线程私有的,他的生命周期与线程是相同的,
虚拟机栈描述的是java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
通常,我们在网上可以看到,我们经常把java内存区分为堆内存和栈内存。
这其实是非常粗糙的概念,在这个概念中,栈内存存放着基本数据类型变量和引用
以及普通对象的引用,而基本数据常量(final static修饰)以及引用在常量池中,而堆中存放着所有的对象实例。
而其实上面所说的栈其实对应的是虚拟栈中的局部变量表,它存放了编译期可知的各种基本类型,对象引用(refrence类型,它不等同于对象本身,可能是指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄与其他与此对象相关的位置)和rerunAddress类型(指向了一条字节码指令的地址)。
其中64位长的long和double类型的数据会占用两个局部变量表空间,其余的数据类型只占用一个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期不会改变局部变量表的大小。(也就是在运行期之前,局部变量的引用都已经分配好了内存空间了??,但是类变量(静态变量)没有,静态变量在类的链接中的准备阶段分配内存,但是也同样知识分配了内存空间,静态变量的内存空间在方法区中,并没有初始化,静态变量的初始化时是在类的初始化阶段)
二.本地方法栈
本地方法栈是为Native方法服务的,Native均为非java语言实现
三.java堆
对于大多应用来说,java堆是java虚拟机所管理的内存中的最大的一块。java堆是被所有线程共享的一块内存区域。此内存区域的唯一母的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
四.方法区
方法区也是所有线程共享的内存区
他用于存储一别虚拟机加载的类信息,常量,静态变量,及时编译器编译后的代码等数据。
接下来我们看一下类加载过程
1.装载
1)将class文件转化为二进制数据流
2)将二进制数据放入相应的方法区
3)生成java.lang.class类实例,如果出错,直到在第一次主动使用该类的时候报错
2.链接
1)校验
需要对类的private public 以及属性进行合规性校验。
2)准备
为类变量分配内存空间,但此时不会执行任何java代码,即不会讲类变量初始化。
3)将符号引用变为直接引用
3.类初始化
第一次主动使用该类的时候会进行类初始化
new getInstance 通过反射得到
调用类的静态方法或者静态变量
main函数
接下来我们用一个例子来分析类的编译到运行的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值