2.内存结构(程序计数器+虚拟机栈)

zhanglei 2022年06月12日 289次浏览

1.程序计数器

1.1 定义

Program Counter Register 程序计数器 (寄存器)

下图是程序计数器在JVM的部分:

image-20220612091931454

1.2 作用

​ 作用:记住下一条jvm指令的地址

image-20220612094013302

​ 特点:
是线程私有的

image-20220612095507799

​ 不会存在内存溢出

2.虚拟机栈

​ 首先回顾一下数据结构里的栈的概念,栈是线程运行所需要的空间,栈帧是每个方法运行时所需要的空间(变量,方法参数,返回值等都需要存储空间)

​ 栈是一种先进后出的数据结构,入栈和出栈过程如下图:

2.1 定义

Java Virtual Machine Stacks (Java 虚拟机栈)

​ 每个线程运行时所需要的内存,成为虚拟机栈

​ 每个 栈由多个栈帧组成(frame),对应着每次方法调用时所占用的内存

​ 每个线程只能有一个活动栈帧,对应的当前正在执行的哪个方法

下面在idea里用debug模拟进出栈的过程

首先创建一个类Demo1_1

image-20220612164038908

开启debug模式

image-20220612164304034

按stepinto按钮

image-20220612164541432

stepinto之后,方法1入栈:

image-20220612164711983

按stepinto,方法2入栈:

image-20220612164839338

​ 同时右边variables一栏展示了方法2栈帧里的变量

按stepover继续向下执行

image-20220612165216887

按stepover继续向下执行

image-20220612165320462

按stepover继续向下执行

image-20220612165426985

按stepover继续向下执行(最后一步…)

image-20220612165709553

2.2 栈内存溢出

​ 栈帧过多导致栈内存溢出(比如说递归没设置出口,方法一直调用自己)

​ 栈帧过大导致栈内存溢出