内存池与JVM内存模型
可以这样理解:JVM内存模型其实就是JVM在启动的时候从操作系统内存中要了一块大内存,然后将这个大内存分成五个区域:方法区、堆区、虚拟机栈、本地方法栈、程序计数器。
注意区分JVM内存模型与JMM(Java Memory Model)
这次课的目标就是把这张图讲透
四个名词
class文件
即硬盘上的.class文件
class content
类加载器将硬盘上的.class文件读入内存中的那一块内存区域
Class对象
Class<?> clazz = Test_22.class;
对象
Test_22 obj = new Test_22();
JVM内存模型
方法区
需要搞清楚方法区、永久代、元空间三个名词之间的关系
方法区是规范,永久代、元空间是具体实现。或者说,方法区是Java中的接口,永久代、元空间是Java中接口的实现类。
再说下永久代、元空间之间的区别
永久代:jdk8之前方法区的实现,在堆中,用于存放类的元信息,及InstanceKlass类的实例
元空间:jdk8及之后方法区的实现,在OS内存中,用于存放类的元信息
虚拟机栈
JVM是软件模拟的虚拟机,基于栈运行
虚拟机栈中又有很多栈帧,栈帧又被分成了其他区域。理解虚拟机栈的核心就是理解栈帧中的这几个区域
1、局部变量表
2、操作数栈
3、动态链接
4、返回地址
5、附加信息
具体细节见课堂上操作实战
程序计数器
字节码指令前面的index
堆区
内存模型中最核心的区域,也是JVM调优重点关注的区域
本地方法栈
JAVA通过JNI调用C、C++动态链接库需要的栈,随着socket的发展,JNI技术已经用得非常非常少。
this指针是何时赋值的
执行引擎在执行带有操作数的字节码指令时,会有一个构造运行环境的过程。this指针就是在构造运行环境过程中实现的
具体细节见课堂上操作实战
之间的关系
虚拟机栈与方法区
如何理解虚拟机堆方法区的引用:动态链接
虚拟机栈与堆区
如何理解虚拟机栈对堆区的引用:局部变量
方法区与堆区
如何理解方法区与堆区的双向引用:
- 方法区->堆区:静态引用类型的属性
- 堆区->方法区:klass pointer
具体细节见课堂上操作实战
练习
1、将课堂上的知识点整理成笔记、文章
2、如果有能力,可以使用C、C++实现一套自己的JVM内存模型