JVM内存结构详解(5大内存结构图解)

JVM内存结构详解(5大内存结构图解)-mikechen

JVM内存结构在Java面试经常被问到,比如:JVM内存结构的组成及实现等,下面我就重点来详解JVM内存结构@mikechen

JVM内存结构

JVM内存结构的整体结构,如下图所示:

JVM内存结构详解(5大内存结构图解)-mikechen

包含:JVM堆虚拟机栈程序计数器Java方法区本地方法栈,下面我会一一来详解JVM内存结构的5大区域@mikechen

 

堆(Heap)

JVM堆是Java虚拟机管理的内存中最大的一块,如下图所示:

JVM内存结构详解(5大内存结构图解)-mikechen

JVM堆主要包含了新生代、老年代、以及永久区(JDK1.8改名为元空间)。

1.新生代(Young Generation)

新生代 又被划分为三个区域:Eden、From Survivor(S0)、To Survivor(S1),From 、TO很多地方也叫S0、S1区。

大多数新建的对象都位于Eden区,当Eden区被对象填满时就会执行Minor GC,并把所有存活下来的对象转移到其中一个Survivor区。

 

2.老年代(Old Generation)

年老代内存里包含了长期存活的对象和经过多次Minor GC后依然存活下来的对象,通常会在老年代内存被占满时进行垃圾回收。

老年代的垃圾收集叫做Major GC,Major GC通常是跟full GC是等价的,收集整个GC堆。

 

3.元空间(Metaspace)

在JDK 8之后,永久代已经被Metaspace取代,Metaspace是一块与堆独立的内存空间,用于存储类的元数据和静态数据。

 

方法区(Method Area)

Java方法区,英文全称是Method Area,是JVM内存中的一个重要区域,与堆一样是各个线程所共享的内存区域。

如下图所示:

JVM内存结构详解(5大内存结构图解)-mikechen

主要包含以下内容:

1.运行时常量池

运行时常量池(Runtime Constant Pool):存放类中的常量,包括字符串、final修饰的常量等。

 

2.字段数据

字段数据:存储类或接口中声明的变量,字段包括静态字段和实例字段。

 

3.方法数据

方法数据:存储类或接口中声明的方法信息,包括方法的访问修饰符、返回值类型、参数列表和字节码等。

 

4.类数据

类数据:存储已加载的类的信息,包括类的名称、父类、接口、字段、方法等信息

 

5.常量数据

常量数据:存储类中的常量数据,包括静态final字段和String常量等

 

虚拟机栈(JVM Stack)

JVM虚拟机栈,英文全称Java Virtual Machine Stack,如下图黄色框所示:

JVM内存结构详解(5大内存结构图解)-mikechen

JVM虚拟机栈主要作用就是:存储方法执行过程中的数据和临时变量的一块内存区域。

虚拟机栈的每个栈帧(Stack Frame)对应着一个正在执行的方法,栈帧包含了:局部变量表、操作数栈、动态链接、方法返回地址等信息。

如下图所示:

JVM内存结构详解(5大内存结构图解)-mikechen

栈帧包含了:局部变量表、操作数栈、动态链接、方法返回地址等信息。

 

本地方法栈(Native Stack)

本地方法栈,英文全称是Native Method Stack,是JVM内存结构的组成部分,如下图所示:

JVM内存结构详解(5大内存结构图解)-mikechen

虚拟机栈的每个栈帧(Stack Frame)对应着一个正在执行的方法,栈帧包含了:局部变量表、操作数栈、动态链接、方法返回地址等信息。

1.局部变量表(Local Variable Table)

局部变量表是虚拟机栈中的一部分,用于存储方法执行过程中的局部变量。

 

2.操作数栈(Operand Stack)

操作数栈用于存储方法执行时的操作数,当一个方法被调用时,它的参数被压入操作数栈中,方法内部的操作数也会被压入操作数栈中。

 

3.动态链接(Dynamic Linking)

动态链接是指在方法调用时,将方法所在的类和方法的字节码在运行时动态链接起来的过程。

动态链接的目的是为了让虚拟机能够找到方法的实现,以便进行调用。

 

4.方法返回地址(Return Address)

方法返回地址是指在方法调用时,JVM会将调用者的返回地址存储在虚拟机栈中。

 

程序计数器(PC Register)

程序计数器,英文名Program Counter,是一种专门用来存储当前正在执行的指令地址的寄存器,它保证了指令的顺序执行和分支指令的正确执行。

Java编程里的:分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

以上就是JVM内存结构的详解,更多JVM内容,请查看:JVM(Java虚拟机)从0到1全部合集

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法