1.程序计数器
1.1 定义
Program Counter Register 程序计数器 (寄存器)
下图是程序计数器在JVM的部分:
1.2 作用
作用:记住下一条jvm指令的地址
特点:
是线程私有的
不会存在内存溢出
2.虚拟机栈
首先回顾一下数据结构里的栈的概念,栈是线程运行所需要的空间,栈帧是每个方法运行时所需要的空间(变量,方法参数,返回值等都需要存储空间)
栈是一种先进后出的数据结构,入栈和出栈过程如下图:
2.1 定义
Java Virtual Machine Stacks (Java 虚拟机栈)
每个线程运行时所需要的内存,成为虚拟机栈
每个 栈由多个栈帧组成(frame),对应着每次方法调用时所占用的内存
每个线程只能有一个活动栈帧,对应的当前正在执行的哪个方法
下面在idea里用debug模拟进出栈的过程
首先创建一个类Demo1_1
开启debug模式
按stepinto按钮
stepinto之后,方法1入栈:
按stepinto,方法2入栈:
同时右边variables一栏展示了方法2栈帧里的变量
按stepover继续向下执行
按stepover继续向下执行
按stepover继续向下执行
按stepover继续向下执行(最后一步…)
2.2 栈内存溢出
栈帧过多导致栈内存溢出(比如说递归没设置出口,方法一直调用自己)
栈帧过大导致栈内存溢出