Skip to content

The JVM(III) -- JVM内存模型

Posted on:March 22, 2023 at 03:25 PM
Share on

本文从 JDK 各个版本关于内存模型结构的演变,来了解各个区域,包括:程序计 数器、Java 虚拟机栈、本地方法栈、堆和元空间。并了解从 JDK 1.8 开始去掉方 法区引入元空间的核心目的和作用。

JVM内存模型

Table of contents

Open Table of contents

JDK1.6、JDK1.7、JDK1.8 内存模型演变

JDK1.6、JDK1.7、JDK1.8,内存模型演变

各个版本的迭代都是为了更好的适应 CPU 性能提升,最大限度提 升的 JVM 运行效率。这些版本的 JVM 内存模型主要有以下差异:

内存模型各区域介绍

程序计数器

关于程序计数器的定义,如果这样看没有感觉,我们举一个例子。 定义一段 Java 方法的代码,这段代码是计算圆形的周长。

public static float circumference(float r){
  float pi = 3.14f;
  float area=2*pi*r;
  return area;
}

如图是这段代码的在虚拟机中的执行过程,左侧是它的程序计数 器对应的行号。

程序计数器

Java 虚拟机栈

可能这么只从定义看上去仍然没有什么感觉,我们再找一个例子。 这是一个关于斐波那契数列(Fibonacci sequence)求值的例子,我们通过斐波那 契数列在虚拟机中的执行过程,来体会 Java 虚拟机栈的用途。

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳 多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔 子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、…在数学 上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n- 1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数 列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季 刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

斐波那契数列在虚拟机栈中的执行过程

本地方法栈

堆和元空间

Java 堆区域划分

常量池

从 JDK 1.7 开始把常量池从永久代中剥离,直到 JDK1.8 去掉了永久代。而字符串 常量池一直放在堆空间,用于存储字符串对象,或是字符串对象的引用。

jconsole 监测元空间溢出

Share on