天津网站建设开发,茶叶网站建设方案,wordpress 分隔符 sp,好的漂亮的淘宝客网站模板虚拟机栈出现的背景
1.由于跨平台性的设计#xff0c;Java的指令都是根据栈来设计的#xff0c;不同平台CPU架构不同#xff0c;所以不能设计为基于寄存器的。 2.优点是跨平台#xff0c;指令集小#xff0c;编译器容易实现#xff0c;缺点是性能下降#xff0c;实现同…虚拟机栈出现的背景
1.由于跨平台性的设计Java的指令都是根据栈来设计的不同平台CPU架构不同所以不能设计为基于寄存器的。 2.优点是跨平台指令集小编译器容易实现缺点是性能下降实现同样的功能需要更多的指令。
内存中的栈与堆
栈是运行时的单位而堆是存储的单位。 即栈解决程序的运行问题即程序如何执行或者说如何处理数据。堆解决的是数据存储的问题即数据怎么放、放在哪里。
虚拟机栈基本内容
Java虚拟机栈是什么 Java虚拟机栈(Java Viriual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈其内部保存一个个的栈帧Stack Frame,对应着一次次的Java方法调用。 是线程私有的 生命周期 生命周期和线程一致。
作用: 主管Java程序的运行它保存方法的局部变量、部分结果并参与方法的调用和返回。 栈的特点 1.栈是一种快速有效的分配存储方式访问速度仅次于程序计数器。 2.JVM直接对Java栈的操作只有两个 每个方法执行伴随着进栈(入栈、压栈) 执行结果结束后的出栈工作 。 3.对于栈来说不存在垃圾回收问题。
栈中可能出现的异常 Java虚拟机规范允许Java栈大小是动态的或者是固定不变的。 1.如果采用固定大小的Java虚拟机栈那每一个线程的Java虚拟机栈容易可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过Java虚拟机允许的最大容量java虚拟机将抛出一个异常。 2.如果Java虚拟机可以动态扩展并且在尝试扩展的时候无法申请到足够的内存空间或者在创建新的线程时没有足够的内存区创建对应的虚拟机栈那Java虚拟机将会抛出一个OutOfMemoryError异常。
设置栈内存大小 我们可以使用参数-Xss 选项来设置线程的最大空间栈的大小直接决定了函数调用的最多可达深度。
栈的存储单位 1.每个线程都有自己的栈栈中的数据都是以栈帧(Stack Frame) 的格式存在。 2.在这个线程上正在执行的每个方法都一一对用一个栈帧。 3.栈帧是一个内存区块是一个数据集维系着方法执行过程中的各种数据信息。
栈运行原理 1.JVM直接对JAVA栈的操作只有两个就是对栈帧的压栈出栈遵循先进后出后进先出的原则。 2.在一条活动线程中一个时间点上只有一个活动的栈帧。即只有当前在执行的方法的栈帧栈顶栈帧是有效的这个栈帧被称为当前栈帧。Current Frame,与当前栈帧相对应的方法就是当前方法(Current Method), 定义这个方法的类就是当前类(Current Class)。 3.执行引擎运行所有字节码指令值针对当前栈帧进行操作。 4.如果在该方法中调用了其他方法对应的新的栈帧会被创建出来放在栈的顶端成为新的当前帧。
栈帧的内部结构 每个栈帧中存储着: 1.局部变量表(Local Variables) 2.操作数栈(Operand Stack)或表达式栈 3.动态链接Dynamic Linjking(或指向运行时常量池的方法引用) 4.方法返回地址(Return Address) (或方法正常推出或者异常推出的定义) 5.一些附加信息 局部变量表也被称之为局部变量数组或本地变量表 1.定义为一个数字数组主要用用于存储方法参数和定义在方法体内的局部变量这些数据类型包括各个基本数据类型、对象引用。以及returnAddress类型。 2.由于局部变量表是建立在线程的栈上是线程的私有数据因此不存在数据安全问题。 3.局部变量表所需的容量大小是在编译期确定下来的并保存在方法的Code属性的maxinum local variables数据项中。在方法运行期间是不会变局部变量表大小的。
局部变量表(Local variables) 1.方法嵌套调用的次数由栈的大小决定。一般来说栈越大方法嵌套雕鹰次数越多。对一个函数而言它的参数和局部变量越多使得局部变量表膨胀它的栈帧就越大以满足方法调用所需传递的信息增大的需求进而函数调用就会占用更多的栈空间导致其秦涛调用的次数就会减少。 2.局部变量表中的变量旨在当前方法调用中有效在方法执行时虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。当方法调用结束后苏随着方法栈帧的销毁局部变量表也会随之销毁。