笔记——JVM基础

一、运行时的数据区结构


img

JAVA栈

​ java栈是线程私有的,每个方法被执行的时候,java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息,然后入栈,每一个方法被调用执行完毕,就会出栈。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iEqh89YV-1592816496581)(C:\Users\hjsss\AppData\Roaming\Typora\typora-user-images\1587891457912.png)]

局部变量表:存放基本数据类型、对象引用( reference类型)和returnAddress类型指向一个字节码指令的地址)。局部变量存储以局部变量槽(SLot)来表示,long和double占2个槽,其他占一个。

操作数栈: 32位的数据类型所占的栈容量为1,64位的数据类型所占的栈容量为2。在方法执行的时候会有各种字节码指令往操作数栈中入栈和出栈。举个例子,整数加法的字节码指令iadd,会把最接近栈顶的两个int型的元素出栈并相加,然后将结果入栈。

动态链接:每一个栈帧都会包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。

方法出口:当一个方法开始执行后,只有两种方法退出。第一种时执行引擎遇到任意一个方法返回的字节码指令,把返回值传递给上一层,第二种是遇到异常,并且这个异常没有在方法体中处理,就会导致方法退出。

本地方法栈

区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和 OutOfMemoryError 异常。

程序计数器

内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成

如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。

对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。

方法区

类信息、静态变量、常量、即时编译器编译后的代码缓存等

直接内存

非虚拟机运行时数据区的部分

在 JDK 1.4 中新加入 NIO (New Input/Output) 类,引入了一种基于通道(Channel)和缓存(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。可以避免在 Java 堆和 Native 堆中来回的数据耗时操作。
OutOfMemoryError:会受到本机内存限制,如果内存区域总和大于物理内存限制从而导致动态扩展时出现该异常。

作。
OutOfMemoryError:会受到本机内存限制,如果内存区域总和大于物理内存限制从而导致动态扩展时出现该异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值