当前位置:首页 > 内存 > 正文

简述一下jvm的内存模型(jvm内存模型简单理解)

  • 内存
  • 2024-05-05 15:39:42
  • 8371

一、什么是Java的JVM?

Java的JVM(JavaVirtualMachine)是Java程序运行的平台。它负责加载和执行Java字节码程序并管理运行时操作,例如内存和垃圾收集。JVM是JavaSE架构的重要组成部分。不同的JVM实现不同的Java规范。

JVM的主要组件包括:

Java虚拟机(JavaVirtualMachine):是JVM的核心,包括类加载器、字节码解释器、垃圾收集器以及组件别人的。

Java内存模型(JavaMemoryModel):定义了Java中不同线程之间存储和读取变量的规则。

Java指令集(JavaInstructionSet):定义了Java语言指令的集合,包括类型、操作码等。

JVM通过解释器将Java字节码程序编译为本地机器码,加载到内存中执行。JVM还负责垃圾收集、内存管理等操作,保证Java程序的稳定运行。因此,Java程序的性能和稳定性很大程度上取决于JVM的性能和优化


二、JVM内存结构

 ()类加载子系统

 连接初始化

 ()方法区被所有线程共享。垃圾收集还会清理方法区中不可用的类型对象

类加载器加载类时从类文件中获取的类型信息

类的完整有效名称

full以及父类的有效名称(除了interface和javalangObject,因为没有超类)

类型修饰符

类型直接接口列表

b常量池存储所有类型类型使用的常量对字段和方法的符号引用

C域信息jvm必须存储该类型在方法区中的所有字段的相关信息以及字段的声明顺序

字段中的相关信息包括

域名

域名类型

域名修饰符(publicprivateprotectedstaticfinalvolatiletransient...)

方法信息

方法名称

方法返回类型

方法参数

方法修饰符

方法字节码(除abstract和native外)(由PC寄存器指向)

操作数栈和方法栈帧的局部变量区大小

异常表

e类的静态变量(所有对象共享一份)

F类的类变量声明为final(所有对象共享一份)

g对加载类的类加载器的引用

:hClass参考

:i方法表

:j示例

:ClassLava{

、privateintspeed=;

、voidflow();

、}

、ClassVolcano{

、publicstaticvoidmain(String[]args){

​Lavalava=newLava();

​lavaflow();

​}

}

现在我们描述如何main()方法的第一条指令的字节码是不同jvm实现的实现。这只是其中之一。

要运行这个程序,您需要以某种方式将Volcano发送到jvm。通过这个名称,jvm找到类文件(Volcanoclass)并读取它,从类文件中提取类型信息并将其放入方法区通过解析方法区中找到的字节码,jvm调用main()方法。在运行时,jvm维护一个指向当前类(Volcano)的常量池。注意jvm已经开始执行了。就像大多数jvm一样,在运行开始之前加载所有类。它仅在需要时启动。

main()的第一条指令告诉jvm为第一个元素中列出的类分配足够的内存。常量池

Jvm使用指向火山常量池的指针来查找它,其中一个发现是对Lava类的符号引用,然后它检查方法区以查看熔岩是否已被加载,引用很简单类熔岩上的完全限定名称这里我们看到,对于jvm来说,从名称中尽快找到一个类是多么重要,还有良好的数据结构如哈希表搜索树等。可以使用相同的算法对于类class的forName()的实现

当jvm发现一个叫Lava的类没有被加载时,它就开始搜索并加载类文件Lavaclass,它从类文件中提取类型信息并将其放置在方法区中。常量池的第一个元素这个指针可以用来快速找到lava类。这个替换过程称为常量池溶解。这里我们替换了一个原生指针来为新的熔岩对象分配空间。这一次,jvm是否还需要方法区中一个lava对象需要多少空间的信息?

当jvm知道一个lava对象需要多少空间时,它会在堆上分配空间并初始化该实例的变量速度为默认值如果lava的父对象也有实例变量也会被初始化

当新生成的lava对象的引用被压入堆栈时,第一条指令也会被初始化终止。以下说明使用此引用来激活java代码并将速度变量设置为其原始值。另外,指令将使用此引用来调用Lava对象的flow()方法

()堆在运行时存储所有对象和数组

()每次分配新线程时都会激活堆栈

()PC寄存器(程序计数器)

始终指向指令。线程要执行的指令的位置放置在方法区的方法字节码中。26491


三、JVM中一个线程的Java栈和寄存器中分别放的是什么?

JVM内存模型:Java代码运行在Java虚拟机上,由Java虚拟机通过解释执行(解释器)或者编译执行(即时编译器)来完成。因此,Java内存模型是指Java虚拟机的运行时内存模型。
运行时内存模型分为两类:线程的私有数据区和共享数据区。线程私有数据区包括程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包括Java堆、方法区,方法区中有常量池。JavaRuntime内存模型图如下:

从图中可以看出内存分为两类:私有内存和线程共享内存:

(1)线程的私有区域,包括以下三类:

程序计数器,记录正在运行的虚拟机的字节码地址;

虚拟机栈:方法运行的内存区域每个方法运行时,都会在虚拟机栈中创建一个栈帧;

本地方法栈:本地方法执行的内存区域。虚拟机的;


(2)线程的共享区域,包括以下两类

Java堆:象分配内存的区域;

方法区:存储类信息、常量、静态变量、编译器编译的代码等数据;

常量池:存储各种文字和符号引用由编译器生成,是方法区的一部分。


发帖者提到的Java堆栈一般指的是图中的虚拟机堆栈。在代码中调用方法的过程中,经常需要在方法之间进行切换。,执行完后返回,所以跳转前必须将当前方法的基本信息压入栈并保存。
3.注册表问题
对于Java中最常用的虚拟机来说,Sun提供的热点虚拟机是基于堆栈的虚拟机;Android机器机器使用Google提供的Dalvik和ART虚拟机Android5.0以后默认使用ART虚拟机,是基于寄存器的虚拟机。发帖者问的是jvm(javavm),这是一个基于堆栈的虚拟机。那么,关于虚拟机栈,我们就更详细的分析这块内存的内容,如下图:

可以看到,c'是虚拟机堆栈中的一个帧由堆栈帧组成,堆栈帧包含局部变量表、操作堆栈和其他子级。当线程运行、代码执行时,通过程序计数器不断执行下一条指令。在实际的指令操作和其他操作过程中,操作栈操作数被压入和压出堆栈,并且操作数在局部变量表和操作栈之间转移。

上一篇:简述JVM内存模型

下一篇:jvm内存模型图