【Java进阶知识】Java虚拟机中的内存区域

Java虚拟机在执行Java程序时,会将Java内存分为多个区域,它们各自有不同的存储数据以及作用,接下来就将介绍Java虚拟机中内存的分布情况。

1.程序计数器

程序计数器是一块较小的内存,可以看作是当前线程所执行行号指示器。字节码指示器的作用就是指示下一条需要执行的字节码的指令。分支、循环、跳转、异常处理、线程恢复等都需要依赖这个计数器来完成。
由于Java多线程时通过线程轮流切换,并分配执行时间的方式来实现的,在任何时间,一个CPU只能执行一个线程,因此当线程结束后需要恢复到正常位置时,就需要使用程序计数器,因此每一个线程都有一个独立的程序计数器我们称这类内存区域为线程私有内存区域。

2. Java虚拟机栈

同程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。事实上,我们常说的栈就指的是虚拟机栈,也是Java方法执行的内存模型。在每个方法执行时,都会创建一个栈帧它主要用于存储局部变量、操作数栈、动态链接、方法出口等信息。每一个方法从调用开始到结束都对应栈帧入栈出栈的操作。

这里我们重点关注局部变量表部分:局部变量表存放了编译期间可知各种基本数据类型和引用数据类型。局部变量表所需要的内存在编译期间就完成分配,当进入一个方法时,需要分配多大的内存是完全确定的,在方法执行时不可更改。

3.本地方法栈

本地方法栈也是栈,它与虚拟机栈作用相似,唯一的不同就是虚拟机栈为执行Java方法服务,而本地方法栈则为虚拟机使用的Native方法进行服务。

4.堆区

Java堆区也是Java虚拟机中管理的最大的一份内存,是被线程共享的一块区域,在虚拟机启动时就创建出来。其最大的作用就是存放对象实例,几乎所有的对象实例都在堆中分配空间。Java堆也是垃圾回收器主要管理的区域,因此也称为”GC堆“

5.方法区

方法区同Java堆一样是被线程共享的一块区域。它主要存储已被虚拟机加载过的类信息、常量、静态变量等数据。
在JDK1.7的虚拟机中已经将原本放在方法区的字符串常量池移到堆中

6.运行时常量池

运行时常量池时方法区的一部分,常量池用于存储编译期生成的各种字面量和符号引用这部分内容将在类加载后进入方法区的运行时常量池释放。一般情况下不仅会保存类中描述的符号引用,还会把翻译出来的直接引用也存储在运行时常量池中。
其中:
字面量——final常量、基本数据类型的值
符号引用——类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符
运行时常量池相比于Class文件常量池的另一个特性时具备动态性,Java语言中并没有要求常量一定在编译期间产生,因此运行期间也可能将行的常量放在池中,例如String类的intern()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值