JVM入门学习笔记——上篇:内存与垃圾回收(3-7)

文章目录

  • 3、运行时数据区概述及线程
    • 一、概述
      • 运行时数据区的内部结构
      • 关于线程间共享的说明
    • 二、线程
      • JVM系统线程
  • 4、程序计数器/PC寄存器(PC Rigister)
    • 一、PC Rigister介绍
    • 二、举例说明
    • 三、两个常见问题
      • 问题一
      • 问题二
      • CPU时间片
  • 5、虚拟机栈
    • 一、虚拟机栈概述
      • 虚拟机出现的背景
      • 内存中的栈与堆
      • 虚拟机栈基本内容
    • 二、栈的存储单位
      • 栈运行原理
      • 栈帧的内部结构
    • 三、局部变量表(Local Variables)
      • 关于变量槽Slot的理解
      • Slot的重复利用
      • 静态变量与局部变量的对比
    • 四、操作数栈(Operand Stack)
    • 五、代码追踪
    • 六、栈顶缓存技术
    • 七、动态链接(指向运行时常量池的方法引用)
    • 八、方法的调用:解析与分派
      • 虚方法与非虚方法
      • 关于invokedynamic指令
      • 方法重写的本质
      • 虚方法表
    • 九、方法返回地址(Return Address)
    • 十、一些附加信息
    • 十一、栈的相关面试题
  • 6、本地方法接口
  • 7、本地方法栈

3、运行时数据区概述及线程

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第1张图片

一、概述

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第2张图片
按照HotSpot虚拟机讲解,JRockit和J9是没有方法区的。
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第3张图片

运行时数据区的内部结构

运行时数据区分为:元空间、堆、虚拟机栈、程序计数器、本地方法区。

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第4张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第5张图片

关于线程间共享的说明

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第6张图片

二、线程

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第7张图片

JVM系统线程

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第8张图片

4、程序计数器/PC寄存器(PC Rigister)

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第9张图片

一、PC Rigister介绍

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第10张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第11张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第12张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第13张图片

二、举例说明

	int i = 10;
	int j = 20;
	int k = i + j;
	
	String s = "abc";
	System.out.println(i);
	System.out.println(k);

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第14张图片

三、两个常见问题

问题一

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第15张图片
用于记录下一条要执行的字节码指令。

问题二

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第16张图片
因为CPU会在线程间切换着运行,所以每个线程都需要记录自己下一条执行什么字节码指令。
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第17张图片

CPU时间片

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第18张图片

5、虚拟机栈

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第19张图片

一、虚拟机栈概述

虚拟机出现的背景

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第20张图片

内存中的栈与堆

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第21张图片

虚拟机栈基本内容

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第22张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第23张图片

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第24张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第25张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第26张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第27张图片

二、栈的存储单位

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第28张图片
一个线程是一个栈,一个方法是一个栈帧。

栈运行原理

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第29张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第30张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第31张图片

栈帧的内部结构

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第32张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第33张图片
栈帧分为:局部变量表、操作数栈、动态链接、方法返回地址、一些附加信息(后三个合一起可称为帧数据区)。
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第34张图片

三、局部变量表(Local Variables)

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第35张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第36张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第37张图片
如果此方法不是静态的,那么此局部变量表的第一位自动写入this。
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第38张图片

关于变量槽Slot的理解

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第39张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第40张图片

Slot的重复利用

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第41张图片

静态变量与局部变量的对比

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第42张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第43张图片
在这里插入图片描述
JVM会为成员变量进行初始化赋值,但不会为局部变量进行初始化,需要我们自己给局部变量赋值。
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第44张图片

四、操作数栈(Operand Stack)

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第45张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第46张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第47张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第48张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第49张图片

五、代码追踪

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第50张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第51张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第52张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第53张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第54张图片

六、栈顶缓存技术

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第55张图片

七、动态链接(指向运行时常量池的方法引用)

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第56张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第57张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第58张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第59张图片

八、方法的调用:解析与分派

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第60张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第61张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第62张图片

虚方法与非虚方法

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第63张图片

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第64张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第65张图片

关于invokedynamic指令

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第66张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第67张图片

方法重写的本质

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第68张图片

虚方法表

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第69张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第70张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第71张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第72张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第73张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第74张图片

九、方法返回地址(Return Address)

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第75张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第76张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第77张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第78张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第79张图片

十、一些附加信息

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第80张图片
在这里插入图片描述
栈帧中不一定会有。

十一、栈的相关面试题

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第81张图片

6、本地方法接口

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第82张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第83张图片
native修饰的方法就是本地方法。此方法虽然看起来像是没有方法体,实际上它是有方法体的,只不过它的方法体是用非java代码实现的,和abstract抽象方法不相同。
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第84张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第85张图片

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第86张图片

7、本地方法栈

JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第87张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第88张图片
JVM入门学习笔记——上篇:内存与垃圾回收(3-7)_第89张图片

下一篇笔记:JVM入门学习笔记——上篇:内存与垃圾回收(8-9)

学习视频(p39-p65):https://www.bilibili.com/video/BV1PJ411n7xZ?p=39

你可能感兴趣的:(JVM)