2-JVM中有哪些内存区域,分别都是用来干嘛的

本文详细解析JVM为何划分不同内存区域,涉及方法区(元数据空间)、程序计数器、虚拟机栈、堆内存及其作用。理解这些区域有助于掌握内存管理在Java程序中的关键原理。

问题1:jvm为啥会划分不同的内存区域?

(首先必须要有一块区域来存放jvm加载进来的类,必须要有一块区域来存放变量和对象)所以划分为不同的内存区域就是为了在运行过程中可以根据需要来使用。

问题2:那jvm的内存区域都有哪些呢?

2.1 方法区

(在1.8以后,这块区域的名字改为metaspace,–元数据空间) :这块区域**主要存放.class文件里加载进来的类 ,还有一些类似常量池的东西
**

2.2 程序计数器

1)当代码被jvm加载到内存后,就需要被执行,而计算机并不认识这些代码,需要把java代码编译成字节码 ,就会对应各种字节码指令。

2)而如何来执行这些字节码指令呢?就需要用到jvm的字节码执行引擎 ,去执行这些字节码指令 。

3)而执行这些字节码指令的时候,就需要一个特殊的内存区域,即程序计数器。 程序计数器的作用就是记录当前执行的字节码指令的位置,也就是记录当前执行到了哪一条字节码指令

4)同时jvm支持多个线程 ,所以写好的代码可以开启多个线程并发执行不同的代码,所以就会有多个线程并发执行不同的代码指令;
所以每一个线程都会对应 一个程序计数器,专门记录当前这个线程目前执行到了哪一条字节码指令

2.3 java虚拟机栈

在方法中,经常会定义一些局部变量。而java虚拟机栈主要是用来保存每个方法内的局部变量等数据的每个线程都有自己的Java虚拟机栈,而比如main线程就会有自己的java虚拟机栈, 用来存放自己执行的那些方法的局部变量 在这里插入图片描述
1) 如上图所示,而紧接着 main线程会继续执行ReplicaManager对象里的方法 比如下面这样,就在“loadReplicasFromDisk”方法里定义了一个局部变量:“hasFinishedLoad” 当main线程在执行loadReplicasFromDisk方法时,就会为loadReplicasFromDisk创建一个栈帧,然后压入main线程自己的java虚拟机栈里面去,然后再栈帧的局部变量表中就会有hasfinishedload这个变量

2) 而同理如果loadReplicasFromDisk也调用了别的方法,而别的方法里面也有局部变量,那么同样会把对应的局部变量压入java虚拟机栈中在这里插入图片描述
3)总结java虚拟机栈的作用:调用执行任何方法时,都会给方法创建栈帧然后入栈,在栈帧里存放了这个方法对应的局部变量之类的数据,包括这个方法执行的其他相关的信息,方法执行完毕之后就出栈。

2.4 java堆内存

堆内存用于 存放我们在代码中创建的各种对象;
同时因为在方法中创建了这个对象,而java虚拟机栈会将这个对象的局部变量存放到局部变量表中,所以从java虚拟机栈中的这个引用变量指向java堆内存
在这里插入图片描述

2.5总结图在这里插入图片描述

思考题:我们在java堆内存中分配的那些对象,到底会占用多少内存?一般怎么来计算和估算,我们系统创建的对象对内存占用的压力?

答案:一个对象对内存空间的占用大致分为两块:1.对象本身的一些信息; 2 对象的实例变量作为数据占用的空间。比如说对象头,在64位的linux系统中会占用16个字节,而如果实例对象的内部有int类型的变量,会占用4个字节;有long类型的变量会占用8个字节,如果有数组或者map之类的,还会占用更多的空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值