宁波网站优化方案,青岛网站建设¥青岛博采网络,全球搜官网,阿里巴巴官网下载手机版目录 1.程序计数器2.栈Java虚拟机栈 - 栈帧的组成1.Java虚拟机栈-局部变量表3.Java虚拟机栈-操作数栈3.Java虚拟机栈-帧数据 3.Java虚拟机栈-栈内存溢出4.本地方法栈 ⚫ Java虚拟机在运行Java程序过程中管理的内存区域#xff0c;称之为运行时数据区。 ⚫ 《Java虚拟机规范》中… 目录 1.程序计数器2.栈Java虚拟机栈 - 栈帧的组成1.Java虚拟机栈-局部变量表3.Java虚拟机栈-操作数栈3.Java虚拟机栈-帧数据 3.Java虚拟机栈-栈内存溢出4.本地方法栈 ⚫ Java虚拟机在运行Java程序过程中管理的内存区域称之为运行时数据区。 ⚫ 《Java虚拟机规范》中规定了每一部分的作用。 1.程序计数器 ⚫ 程序计数器Program Counter Register也叫PC寄存器每个线程会通过程序计数器记录当前要执行的的字节码指令的地址 ⚫ 在加载阶段虚拟机将字节码文件中的指令读取到内存之后会将原文件中的偏移量转换成内存地址。每一条字节码指令都会拥有一个内存地址。 ⚫ 在代码执行过程中程序计数器会记录下一行字节码指令的地址。执行完当前指令之后虚拟机的执行引擎根据程序计数器执行下一行指令 ⚫ 程序计数器可以控制程序指令的进行实现分支、跳转、异常等逻辑。 ⚫ 在多线程执行情况下Java虚拟机需要通过程序计数器记录CPU切换前解释执行到那一句指令并继续解释运行。 程序计数器在运行中会出现内存溢出吗 ⚫ 内存溢出指的是程序在使用某一块内存区域时存放的数据需要占用的内存大小超过了虚拟机能提供的内存上限。 ⚫ 因为每个线程只存储一个固定长度的内存地址程序计数器是不会发生内存溢出的。 ⚫ 程序员无需对程序计数器做任何处理。 2.栈
Java虚拟机栈Java Virtual Machine Stack采用栈的数据结构来管理方法调用中的基本数据先 进后出First In Last Out,每一个方法的调用使用一个栈帧Stack Frame来保存。 ⚫ Java虚拟机栈随着线程的创建而创建而回收则会在线程的销毁时进行。由于方法可能会在不同线程中执行每个线程都会包含一个自己的虚拟机栈。 Java虚拟机栈 - 栈帧的组成 1.Java虚拟机栈-局部变量表
⚫ 局部变量表的作用是在方法执行过程中存放所有的局部变量。编译成字节码文件时就可以确定局部变量表的内容。 ⚫ 栈帧中的局部变量表是一个数组数组中每一个位置称之为槽(slot) long和double类型占用两个槽其他类型占用一个槽。 ⚫ 实例方法中的序号为0的位置存放的是this指的是当前调用方法的对象运行时会在内存中存放实例对象的地址。 ⚫ 方法参数也会保存在局部变量表中其顺序与方法中参数定义的顺序一致。 ⚫ 局部变量表保存的内容有实例方法的this对象方法的参数方法体中声明的局部变量。 ⚫ 为了节省空间局部变量表中的槽是可以复用的一旦某个局部变量不再生效当前槽就可以再次被使用
3.Java虚拟机栈-操作数栈
⚫ 操作数栈是栈帧中虚拟机在执行指令过程中用来存放中间数据的一块区域。他是一种栈式的数据结构如果一条指令将一个值压入操作数栈则后面的指令可以弹出并使用该值。 ⚫ 在编译期就可以确定操作数栈的最大深度从而在执行时正确的分配内存大小。
3.Java虚拟机栈-帧数据
⚫ 当前类的字节码指令引用了其他类的属性或者方法时需要将符号引用编号转换成对应的运行时常量池中的内存地址。动态链接就保存了编号到运行时常量池的内存地址的映射关系。 ⚫ 方法出口指的是方法在正确或者异常结束时当前栈帧会被弹出同时程序计数器应该指向上一个栈帧中的下一条指令的地址。所以在当前栈帧中需要存储此方法出口的地址。 ⚫ 异常表存放的是代码中异常的处理信息包含了异常捕获的生效范围以及异常发生后跳转到的字节码指令位置
3.Java虚拟机栈-栈内存溢出
⚫ Java虚拟机栈如果栈帧过多占用内存超过栈内存可以分配的最大大小就会出现内存溢出。 ⚫ Java虚拟机栈内存溢出时会出现StackOverflowError的错误 如果我们不指定栈的大小JVM 将创建一个 具有默认大小的栈。大小取决于操作系统和 计算机的体系结构。 Java虚拟机栈 – 注意事项 1、与-Xss类似也可以使用 -XX:ThreadStackSize 调整标志来配置堆栈大小。 格式为 -XX:ThreadStackSize1024 2、HotSpot JVM对栈大小的最大值和最小值有要求 比如测试如下两个参数: -Xss1k -Xss1025m Windows64位下的JDK8测试最小值为180k最大值为1024m。 3、局部变量过多、操作数栈深度过大也会影响栈内存的大小。 一般情况下工作中即便使用了递归进行操作栈的深度最多也只能到几百,不会出现栈的溢出。所以此参数可以手动指定为-Xss256k节省内存。
4.本地方法栈
⚫ Java虚拟机栈存储了Java方法调用时的栈帧而本地方法栈存储的是native本地方法的栈帧。 ⚫ 在Hotspot虚拟机中Java虚拟机栈和本地方法栈实现上使用了同一个栈空间。本地方法栈会在栈内 存上生成一个栈帧临时保存方法的参数同时方便出现异常时也把本地方法的栈信息打印出来。