JVM 内存模型整理

本文详细介绍了JVM内存模型的各个组成部分,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区(在JVM不同版本中的变化)。每个部分都详细阐述了其概念、特点和作用,对于理解Java程序的执行机制具有重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、前言

二、具体介绍

1、程序计数器

1.1、概念

1.2、特点

2、Java的虚拟机栈

2.1、概念

2.2、局部变量表

2.3、操作数栈

2.4、动态链接

2.5、 方法的返回地址

2.6、附加信息

3、本地方法栈(Native栈)

3.1、概念

4、堆

4.1、概念

4.2、Java堆细分

4.3、分代策略

5、方法区(MethodArea)

 5.1、概念

5.2、方法区结构 

5.3、HotSpot在1.7版本以前和1.7版本,1.7版本后都有变化

5.4、直接内存


一、前言

我们要明白所说的Java内存就是JVM内存,Java代码是运行在Java虚拟机之上的,由Java虚拟机通过解释执行(解释器)或编译执行(JIT编译器)来完成,故Java内存模型,也就是指Java虚拟机的运行时内存模型。

二、具体介绍

1、程序计数器

1.1、概念

程序计数器( ProgramCounterRegister)是一块较小的内存空间,它可以看作是当前线程所执行的Java字节码的行号指示器。可以理解为程序计数器在这里记住的JVM下一条指令的执行地址,当第一条指令执行完,那么解释器就会到程序计数器中取寻找下一条指令。在物理上来讲的话 程序计数器是通过寄存器来实现的。

1.2、特点

1.2.1、如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是Native方法,这个计数器值则为空(Undefined,并且所有的CPU 都有一个PC 每执行一条指令PC都会自增 因此PC存储了指向下一条要被执行的指令。

1.2.2、线程是私有的

每个线程都有自己的程序计数器,来记录自己线程执行到的指令,各条线程之间计数器互不影响,独立存储这就是我们所说的线程是私有的,并且当某一个线程执行完成之后,它会从自己的程序计数器中取出要执行的下一条指令。

1.2.3、程序计数器 不存在内存溢出 OOM(OutOfMemoryError),因为程序计数器是很小的空间 ,可以把它看成字节码行号的指示器。

2、Java的虚拟机栈

2.1、概念

Java中每个线程在运行的时候都需要划分内存空间,虚拟机栈是指每个线程在运行时需要的内存空间,所以说每条线程中都会存在一个虚拟机栈,而虚拟机栈中的每一块空间都是一个栈帧,一个栈帧对应着一次方法的调用。且每一个栈帧都用于存储局部变量表、操作数栈、动态链接、方法返回地址、额外的信息等。

2.2、局部变量表

局部变量表主要存放的数据:

2.2.1、编译期的的各种基本数据类型(boolean、byte、char、short、int、float、long、double)

2.2.2、对象的引用 reference 类型  引用指针

2.2.3、ReturnAddress 类型  -----指向了一条字节码指令

其中64位的long double 会占用两个局部变量的空间(slot) 其余的类型都只占用1个slot。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

2.2.4、异常

如果线程请求的栈的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;虚拟机的栈是可以进行动态扩展的,当扩展时申请不到足够的内存时,将抛出OutOfMemoryError异常。

2.3、操作数栈

2.3.1、概念

操作数栈类似于局部变量表, 操作栈也是后进先出,操作数栈的最大深度 class文件中的Code属性max_stacks  数据项。

2.3.2、操作数栈存储的类型

32位的数据类型 栈容量为1

64位的数据类型 栈容量为2

栈容量的单位 ----字宽

对32位的虚拟机 一个字宽是 4个字节

对64位的虚拟机 一个字宽是8个字节<

JVMJava虚拟机)模型是指Java程序在运行时的执行环境,包括JVM的组成部分和它们的工作原理。JVM内存模型是指Java虚拟机管理程序运行时内存的方式,包括内存划分、内存分配和对象回收等机制。 JVM模型的组成部分包括类加载器、解释器、即时编译器、垃圾收集器等。类加载器负责将Java类加载到JVM中,并将其转换为可执行代码;解释器负责解释字节码并执行相应的指令;即时编译器则将频繁执行的代码编译成本地机器码,以提高程序的执行效率;垃圾收集器则负责回收程序运行时不再使用的内存JVM内存模型规定了Java程序运行时内存的分配和管理方式。JVM内存模型内存划分为不同的区域,包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。其中,堆是Java程序运行时内存中最大的区域,用于存储对象实例。虚拟机栈和本地方法栈则用于存储程序执行时的局部变量和方法调用信息。方法区用于存储已加载的类信息、常量池、静态变量等数据。程序计数器则用于记录当前线程所执行的字节码指令位置。 JVM内存模型还包括垃圾回收机制,用于自动回收程序运行时不再使用的内存。垃圾回收机制采用标记-清除、复制、标记-整理等不同的算法来回收内存。 总之,JVM模型和JVM内存模型Java程序运行时的重要组成部分,了解和掌握它们的工作原理对于编写高效、稳定的Java程序至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值