深入理解Java虚拟机读书笔记-1

Java 虚拟机内存结构
JVM 在运行过程中会把内存划分为多个不同的数据区域,有的区域是所有线程共享的,如方法区和堆,还有的区域是线程隔离的,例如虚拟机栈、本地方法栈和程序计数器。

1、程序计数器(Progress Counter Register)
可以看做是当前线程所执行的字节码的行号指示器,在 JVM 的概念模型(并非具体实现)中,字节码解释器工作时就是通过改变这个计数器的值来获取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等基础功能都要依赖这个计数器完成。
每个线程的计数器互不影响,独立存储。
如果线程正在执行的是 Java 方法,这个计数器记录的是正在执行的 JVM 字节码指令的地址,如果正在执行的是 native 方法,那么这个计数器的值则为空。
这个内存区域是JVM中唯一一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。

2、Java 虚拟机栈(Java Virtual Machine Stacks)
虚拟机栈也是每个线程私有的内存区域,它描述的是 Java 方法执行的内存模型,每个方法在执行的时候都会生成一个栈帧用来存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直到结束的过程,就对应着一个栈帧在虚拟机栈中的一个入栈和出栈的过程。
比较关键的是局部变量表部分,它存放了编译期间可知的各种基本数据类型和对象引用类型(非对象本身)。
局部变量表所需的内存空间在编译期间就完成分配,在进入一个方法时,该方法需要的栈空间大小是确定的,在方法运行期间不会去改变局部变量表的大小。
这个区域有两种异常状况:当现场请求的栈深度大于 JVM 所允许的深度,将抛出StackOverflowError异常。如果虚拟机栈可以动态扩展但是在扩展时无法申请到足够的内存,将抛出OutOfMemoryError异常。

3、本地方法栈
与虚拟机栈类似,不过执行的 native 方法。具体的虚拟机可以自由实现,有的虚拟机(例如 HotSpot)直接将本地方法栈和虚拟机栈合二为一。

4、堆

5、方法区

6、运行时常量池

7、直接内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值