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

jvm内存模型和jvm内存结构(jvm内存模型图)

  • 内存
  • 2024-06-07 08:37:32
  • 5443

一、JVM内存结构

<()类加载子系统

<加载连接初始化

<()所有线程共享的方法区。垃圾收集还会清理模态区域中无用的类型对象

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

类的完整且有效的名称

完整且有效的名称父类的(除了interface和javalangObject,因为没有父类)

类型修饰符

直接接口列表导入

b常量组存储了使用的所有常量类型一个类型的字段和方法的符号引用

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

的相关信息字段包括

域名

域名类型

域名修饰符(publicprivateprotectedstaticfinalvolatiletransient...)

信息方式

方法名称

方法的返回类型

方法参数

方法修饰符

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

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

异常表

类静态变量e(所有对象共享一个副本)

 声明为类f的final的类变量(所有对象共享一个副本)

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

 h类参考

i方法表

j示例

 voidflow();

 

 ClassVolcano{

 publicstaticvoidmain(String[]args){

 Lavalava=newLava();

​lavaflow();

<

<

接下来我们描述一下main()方法第一条指令的字节码有何不同不同的jvm实现的实现差异很大。

要运行这个程序,您需要通过某种方式将Volcano传递给jvm。jvm通过这个名字找到类文件(Volcanoclass)并读取它,从类文件中提取类型信息并放入方法区。jvm通过解析方法区已有的字节码来调用main()方法。。在执行过程中,jvm维护一个指向当前类(Volcano)的常量组。请注意,jvm在Lava类加载之前就已经开始执行。以便在执行开始之前加载所有类。它只会在需要时开始执行。

main()的第一条语句告诉jvm为常量组第一个条目中列出的类分配足够的内存

jvm使用指向Volcano常量组的指针,以确定OneDiscovery是对Lava类的符号引用,然后检查方法区以查看该符号lava是否已加载。引用只是熔岩层的完全限定名称。这里我们看到,对于jvm来说,尽可能快地从名字中找到一个类,一个好的数据结构可以使用很多不同的方法。像哈希表搜索树等。同样的算法可以用来实现Class类的forName()

当jvm看到名为Lava的类没有被加载时,它就开始搜索并加载Lavaclass类文件。它从class文件中提取出类型信息并放入方法区

然后jvm方法区中直接指向lava类的指针就会替换头项中的符号引用中的元素常数组可以用来快速找到熔岩层。这个替换过程称为常数群解析(constantresolution)。这里我们替换一个根指针

最后,jvm已经启动了。为新的熔岩对象分配空间。这个时候jvm仍然需要方法区的信息。它使用指向熔岩数据的指针(指向火山常数组第一项的指针)来查找它。lava对象需要多少空间?

当jvm知道Lava对象需要的空间量时,它会在堆上分配空间,并将该实例的变化率初始化为其默认值。lava对象还具有也会被初始化的实例变量

当对新创建的lava对象的引用被推入堆栈时,第一个命令也会终止。以下说明使用此参考来启用java代码。并将速度变量设置为其原始值。另外,指令将使用此引用来触发Lava对象的flow()方法

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

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

始终指向线程接下来要执行的指令。指令的位置放置在方法区的方法字节码中。内容是相对第一条命令的偏移量

lishixinzhi/Article/program/Java/hx/201311/。26491


二、java课程分享java多线程的内存模型


硬件内存模型

物理机并发处理的解决方案对于JVM的内存模型的实现也有很大的参考作用。毕竟JVM也是做硬件层的事情,底层的架构也决定了上层的架构建模方式。


计算机并发不仅仅是多个处理器参与计算,它会涉及到一系列的硬件问题,其中最直接的就是需要内存。进行互动。然而,计算机的存储设备与处理器的预算速度相差太大,根本无法满足处理器的处理速度。该怎么办?这是在处理器和内存之间添加一层读写速度接近处理器运算速度的缓存。


缓存将使用过的数据从内存中复制出来,以方便处理器快速运算,然后将计算出的数据同步到主存中。,这样处理器就不需要等待。


缓存虽然解决了处理器和内存之间的冲突,但也给计算机带来了另一个问题:缓存一致性。特别是当多个处理器涉及同一主存区域时,各自的缓存数据可能会不一致。


当出现不一致时,谁应该占上风?


为了解决这个问题,处理器和内存之间的读写需要遵循一定的协议。此类协议包括:MSI、MESI、MOSI、Synapse、Firefly和DragonProtocol等。这就是上图中处理器、缓存和内存的处理方式。


除了缓存之外,为了充分利用处理器,处理器还会对输入指令的乱序执行进行优化代码中,只要输出一致,输入信息就可以乱序重组,所以程序中语句计算的顺序与输入码的顺序不一致。



JVM内存模型

上面我们了解了硬件的内存模型,以此为参考,我们来看看jvm的内存模型。



jvm为了实现跨平台一致的内存访问效果而定义的一组java内存模型,从而屏蔽消除了各种硬件和操作系统的内存访问差异。这与C和C++不同。C和C++会直接使用操作系统的物理硬件和内存模型来处理,因此每个平台上都会有差异。Java的情况并非如此。


Java的内存模型规定所有变量都存储在主存中。Java课程发现每个线程都有自己的工作内存,工作内存保存了线程使用的变量的主内存副本。线程对变量的所有操作、读取和赋值都必须在工作内存中执行。主存变量不能直接写入。线程之间变量值的传递需要主存来完成。



三、Java知识点整理归纳?

经过这么多年的发展,结合一些面试开发者的经验,我认为J2SE最重要的是掌握以下内容。


每个版本1个)

对于刚接触JVM的人来说,JVM相关知识不一定需要深入了解,简单了解所涉及的概念就足够了。然而,对于一个拥有三年以上经验的高级开发人员来说,不了解JVM几乎是无法接受的。

JVM是运行的基础。很难相信对JVM一无所知的人能够彻底理解这门语言。当我面试三年以上经验的开发人员时,JVM几乎是必问问题。当然,JVM并不是唯一决定技术能力的面试题,但它可以证明开发能力的高低。


在JVM这个大范畴中,我认为需要掌握的知识是:

JVM内存模型及结构

GC原理、性能优化

优化:ThreadDump、内存结构分析

类二进制字节码结构、类加载系统、类加载过程、实例创建过程

方法执行流程

各大版本更新提供的新特性(需要简单了解)



使用2.(基本)

这看起来可能很简单。谁不知道如何运行该程序?但通常我们只是通过IDE运行程序。底层IDE是如何运行程序的?很多人不理解。


这是开发者需要掌握的最基本的知识点。对于初学者来说,第一步是教你如何在命令行上运行程序。但很多人在学习和使用完IDE之后就忘记了这一点。为什么强调需要了解这一点?了解了最纯粹的启动方式后,就可以分析此时启动了多少个目录,执行命名是什么,有哪些参数,以及启动过程中是否有文件丢失的问题。这将帮助您解决实际开发过程中可能与环境有关的奇怪问题。

这里需要掌握的知识是:

C编译出来的文件就是类文件

命令的使用,类与packages如何从命令行启动

程序中涉及到的各种路径(clasth、.、运行主目录等)


3。数据类型

这个就不多说了,掌握基本类型和对象类型就行了。长平IT培训建议大家多了解一下JDK是如何自动转换的,包括装箱和拆箱等,注意避免装箱后的类型相等判断

关键知识点:

基本类型:int、long、float、double、boolean、。。。

对应的对象类型:整数等类型到基类型的转换、装箱和拆箱

对象类型:equal、hashcode

字符串类型属性

>