内存池与JVM内存模型

可以这样理解:JVM内存模型其实就是JVM在启动的时候从操作系统内存中要了一块大内存,然后将这个大内存分成五个区域:方法区、堆区、虚拟机栈、本地方法栈、程序计数器。

 

注意区分JVM内存模型与JMM(Java Memory Model)

 

这次课的目标就是把这张图讲透

内存池与JVM内存模型

 

四个名词

 

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内存模型

 

堆区

 

内存模型中最核心的区域,也是JVM调优重点关注的区域

内存池与JVM内存模型

 

本地方法栈

 

JAVA通过JNI调用C、C++动态链接库需要的栈,随着socket的发展,JNI技术已经用得非常非常少。

 

this指针是何时赋值的

 

执行引擎在执行带有操作数的字节码指令时,会有一个构造运行环境的过程。this指针就是在构造运行环境过程中实现的

 

具体细节见课堂上操作实战

之间的关系

 

虚拟机栈与方法区

 

如何理解虚拟机堆方法区的引用:动态链接

 

虚拟机栈与堆区

 

如何理解虚拟机栈对堆区的引用:局部变量

 

方法区与堆区

 

如何理解方法区与堆区的双向引用:

  • 方法区->堆区:静态引用类型的属性
  • 堆区->方法区:klass pointer

 

具体细节见课堂上操作实战

 

练习

 

1、将课堂上的知识点整理成笔记、文章

2、如果有能力,可以使用C、C++实现一套自己的JVM内存模型