JVM(程序计数器及Java虚拟机栈)
2021-12-01 18:06:38 2 举报
JVM(程序计数器及Java虚拟机栈)
作者其他创作
大纲/内容
堆内存
栈帧nCurrentStackFrameN
Java虚拟机栈
程序计数器
局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。局部变量表的容量以变量槽(Variable Slot,下称Slot)为最小单位。在Java程序编译为Class文件时就在方法的code属性的max_locals数据项中确定了该方法所需要分配的局部变量表的最大容量。一个Slot可以存放一个32位以内的数据类型,Java中占用32位以内的数据类型有boolean、byte、char、short、float、reference和returnAddress(异常表)8种类型。64位的数据类型,虚拟机会以高位对齐的方式为其分配两个连续的引Slot空间。虚拟机通过索引定位的方式使用局部变量表,索引值的范围是从0开始至局部变量表最大的Slot数量。如果访问的是32位数据类型的变量,索引 n 就代表了使用第n个Slot,如果是64位数据类型的变量,则说明会同时使用n和n+1两个Slot对于两个相邻的共同存放一个64位数据的两个Slot,不允许采用任何方式单独访问其中的某一个,Java虚拟机规范中明确要求了如果遇到进行这种操作的字节码序列,虚拟机应该在类加载的校验阶段抛出异常。如果是实例方法(非static的方法),那么局部变量表中第0位索引的Slot默认是用于传递方法所属对象实例的引用\"this\
0
索引
存储
this
ServerB.class
局部变量表LocalVariableTable
ServerA.class
记录指令位置
线程
当前栈帧CurrentStackFrame
返回地址ReturnAddress
JVM垃圾回收
执行字节码指令
方法区(永久代Permanent Generetion)
动态链接DynamicLinking
依次存储方法参数表以及方法体内的其他局部变量
字节码执行引擎
类加载器
当前线程
栈帧1CurrentStackFrame1
操作栈OperandStack
永久代的话,我们JVM参数一般会给设置个256M,这个一定要设置,绝对不能不设置JVM参数,使用默认JVM参数可能就给新生代分配一两百兆,永久代分配的可能也很少,一旦并发量上来,系统扛不住,永久代一般就放点类和常量池,一般给256M够了,如果给小了,可能导致频繁的Full GC,因为永久代如果满了,会触发Full GC,这个是很坑的类加载到永久代后,会把类交给字节码执行引擎去执行执行这个操作是线程去执行的,每个线程都配有一个程序计数器和Java虚拟机栈Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:栈帧(Stack Frame)是用于支持Java虚拟机进行方法调用和执行的数据结构,它是虚拟机栈中的栈元素。每个方法在执行到的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。堆内存是被所有线程共享的一块内存区域,所有对象和数组都在堆上进行内存分配。为了进行高效的垃圾回收,虚拟机把堆内存划分成新生代、老年代和永久代(1.8中无永久代,使用metaspace实现)三块区域。Java把内存分成两种:栈内存和堆内存。关于堆内存和栈内存的区别与联系。简单的来讲,堆内存用于存放由new创建的对象和数组,在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。而栈内存由使用的人向系统申请,申请人进行管理。
局部变量表
JVM
栈帧2CurrentStackFrame2
0 条评论
下一页