壹影博客.
我在下午4点钟开始想你
剖析JVM内存模型及对象创建流程详解
  • 2024-3-3日
  • 2评论
  • 2458围观

 

剖析JVM内存模型及对象创建流程详解

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是JRE的一部分,如下图JVM与JDK、JRE的关系图

JVM的主要作用如下:

*运行Java程序 Java源代码经过编译器编译成Java字节码,然后由JVM在目标机器上解释执行。
*内存管理 。JVM负责Java程序运行期间的内存管理,包括内存分配、垃圾回收等。
*自动垃圾回收 。JVM通过垃圾回收机制,自动回收无用对象所占用的内存空间。
*提供安全机制 。防止Java程序对系统资源的非法访问。
*支持多线程 。JVM支持多线程编程,能够高效地管理线程,从而提高程序的并发性能。
...

JVM内存模型是什么?

JVM内存模型,也称为Java Memory Model(JMM),是一种规范,它定义了Java程序在运行时如何分配、使用和释放内存,以及线程和主内存之间的抽象关系。

JVM内存模型规定了所有的变量都存储在主内存中,而每一个线程的执行在JVM中都有自己的工作内存。这就涉及主内存、工作内存之间数据的可见性、一致性、有效性等问题。Java内存模型就是规定如何正确处理这些问题的,由具体的JVM去实现。

 

一、JVM内存模型剖析

整个Java虚拟机在内部的组成包括类装载器、栈、堆、本地方法栈、方法区、程序计数器、字节码执行引擎等,如下图所示

 

 

如上图所示其实,运行时数据区(Java Runtime Data Areas)也就是我们所说的内存模型,下面将一一介绍每一块区域的作用

 

1.栈(线程)-每一个线程单独分配

在Java虚拟机(JVM)的内存模型中,栈(Stack)是虚拟机为每个线程分配的一块内存区域,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。栈的主要作用是支持方法的执行,它保存了方法的现场和执行上下文。具体构成如下图所示:

 

 

栈中由多个栈帧构成,如何理解栈帧呢?实际上每一个栈帧对应的就是每一个方法,一个线程可能会执行多个方法,每一个方法内部存的都是局部的变量,由此可见由多少方法就有多少栈帧。那么栈帧由什么组成呢?

主要有如下几块内存区域组成:

①局部变量表 - 存放方法的局部变量

②操作数栈 - 储存操作数、执行算术和逻辑运算、执行方法调用和返回等

③动态链接 - 将符号引用转换为直接引用(就是在方法内部如果需要用到其他的方法、类、字段等,需要从其他的区域吧这些内容加载进来,将引用转换为直接内容)--符号引用在Java类中通过类、方法、字段等名称来引用其他类、方法、字段等的方式

④方法出口-记录当前方法完毕后,在哪里继续执行

 

2.程序计数器

记录代码执行的行号,当线程切换、方法跳入等上下文切换时要用到,当一个线程运行到了某一行时,切换到了其他线程执行,再切换回来的时候,JVM需要接着上一次的外面位置执行

 

 

3.堆-所有线程共享

在Java内存模型中,堆空间(Heap Space)是JVM(Java虚拟机)所管理的最大一块内存区域,也是所有线程共享的一块区域。几乎所有的对象实例都会在这里分配内存。堆空间是垃圾收集器管理的主要区域,因此也被称为“GC堆”(Garbage Collected Heap)。堆空间的主要特点包括:

①动态分配堆空间的大小可以在运行时动态调整,这取决于JVM的具体实现和操作系统的内存管理。
②自动内存管理Java程序员不需要显式地分配或释放堆内存。堆内存的分配和回收由JVM的自动内存管理机制(如垃圾收集器)自动处理。
③存储对象实例在Java中,所有的对象实例都存储在堆内存中(new)。这些对象可能包括类的实例、数组、字符串等。

 

 

4.方法区(元空间)

方法区也可以说是叫元空间主要存储的是常量、静态变量、类信息,但是需要注意的是静态变量和常量(如静态常量)实际上是存储在Java堆(Heap)中的对象的一部分。方法区(或元空间)存储的是对这些对象的引用。

 

 

5.本地方法栈

在Java虚拟机(JVM)中,本地方法栈(Native Method Stack)是虚拟机线程所私有的一块内存区域。它与Java虚拟机栈(Java Virtual Machine Stack)非常相似,区别在于Java虚拟机栈是为执行Java方法(也就是字节码)服务,而本地方法栈则是为执行Native方法服务。

 

 

二、对象创建的主要流程

那么在JVM中对象创建的具体流程是什么呢? 见下图

当我们去加载一个对象时(new时),jvm会先根据对象的类型判断类是否被加载 如果没有被加载则通过类加载的双亲委派机制去加载这个类,加载完毕后会在jvm中去分配内存,对象是在JVM内存模型的堆空间去分配空间的,具体分配细节见如下图

然后进入初始化阶段,该阶段会对创建的这个类的内部成员赋值默认出初始值 例如 int类型初始值为0、引用对象初始值为null、布尔类型变量初始值为false等等

然后会为对象设置对象头,对象头设置内容如下图所示

在对象初始化完成后,JVM会在对象的内存空间中设置一些额外的信息,这些信息被称为对象头(Object Header)。对象头包含了对象的哈希码(Hash Code)、GC分代年龄(GC Age)、锁状态标记(Lock State)等信息。

最后执行init方法,init方法会为对象的属性赋值上真正的值 例如ini a =666

 

发表评论

Bryanbup

Lv.1 @回复 板凳

[b]你好![/b]
我们是Drop Dead Studio,我们的目标是帮助公司通过自动化营销实现令人印象深刻的销售业绩.
我们使用先进的XRumer程序与我们广泛的联系基础相结合,通过他们网站上的联系表单与潜在客户进行互动.

它真的有效! [b]以下是我们客户成功的一些例子:[/b]
-    一家房地产公司在短短2周内将潜在客户数量增加了50%.
-    网上服装店在短短1个月内销售额增长了20%.
-    健身俱乐部在3个月内吸引了100名新成员.
你想要同样令人印象深刻的结果吗?

[b]这是你需要做的: [/b]
1)    购买访问我们的联系人数据库:https://en.xrumerbasee.ru/.
2)    安装程序 XRumer 和 Xevil: http://www.botmasterru.com/product114989/.
3)    享受结果!

[b]我们保证您将能够: [/b]
-    增加引线的数量。
-    增加销售量。
-    吸引新客户。
不要错过让你的生意更成功的机会!
真诚的,滴死工作室

P.S. 如果你正在读这封信,那就意味着它真的很有效!
P.P.S. 立即行动!
P.P.P.S 看看我的网站 https://en.xrumerbasee.ru/gsa-search-engine-ranker/, 停止延迟任何产品,任何网站的流量增长!
我们是XRumer的销售私人基地,以及gsa和XRumer的新基地。
我们也卖  GSA Search Engine Ranker, 价格比官网便宜2倍,只需$65
快点,限量供应! 祝你好运!

Bryanbup

Lv.1 @回复 沙发

[b]你好![/b]
我们是Drop Dead Studio,我们的目标是帮助公司通过自动化营销实现令人印象深刻的销售业绩.
我们使用先进的XRumer程序与我们广泛的联系基础相结合,通过他们网站上的联系表单与潜在客户进行互动.

它真的有效! [b]以下是我们客户成功的一些例子:[/b]
-    一家房地产公司在短短2周内将潜在客户数量增加了50%.
-    网上服装店在短短1个月内销售额增长了20%.
-    健身俱乐部在3个月内吸引了100名新成员.
你想要同样令人印象深刻的结果吗?

[b]这是你需要做的: [/b]
1)    购买访问我们的联系人数据库:https://en.xrumerbasee.ru/.
2)    安装程序 XRumer 和 Xevil: http://www.botmasterru.com/product114989/.
3)    享受结果!

[b]我们保证您将能够: [/b]
-    增加引线的数量。
-    增加销售量。
-    吸引新客户。
不要错过让你的生意更成功的机会!
真诚的,滴死工作室

P.S. 如果你正在读这封信,那就意味着它真的很有效!
P.P.S. 立即行动!
P.P.P.S 用电报写信给我 https://t.me/DropDeadStudio, 停止延迟任何产品,任何网站的流量增长!
我们是XRumer的销售私人基地,以及gsa和XRumer的新基地。
我们也卖  GSA Search Engine Ranker, 价格比官网便宜2倍,只需$65
快点,限量供应! 祝你好运!