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

内存模型和内存结构(JVM内存模型的理解)

  • 内存
  • 2024-06-11 06:15:50
  • 2877

一、一、Android虚拟机内存模型

JVM运行时数据区域分析
刘望舒的博客
虚拟机内存模型

1.程序计数器:这是确定程序指令执行顺序的唯一块。内存溢出区

2.Java虚拟机栈

**也是线程特定的,负责存储方法内的局部变量、方法终止等。每次运行一个方法时,都与命中堆栈帧相同。该方法执行后,会从Java虚拟机栈中弹出一个栈帧。

3.本地方法区
负责管理虚拟机中使用的C方法。

4.堆内存区域
Java堆是所有线程共享的区域,用于存储对象的实例。它们不需要物理上连续,只需逻辑上连续。

5.方法区
方法区是所有线程共享的内存区域,用于存储Java虚拟机加载的类的结构信息(运行时常量池、字段)。、方法信息、静态变量等数据。

类文件内容


二、Java内存模型详解Java内存模型:深入解析与实例分析

在Java并发编程的世界里,通信和同步是必不可少的要素。Java内存模型主要基于共享内存,每个线程都有私有的本地内存,共享变量存储在主存中。通过Java内存模型(JMM)精确控制线程之间的通信,确保本地内存更新及时与主内存同步,并确保其他线程可以读取最新状态。编译器和处理器的重新排序行为可能会给内存可见性带来挑战。JMM通过一系列规则智能地管理这些复杂性,以确保内存一致性。


直观地理解,当线程A更新共享变量x时,JMM会将这一更改从本地内存写入主内存,然后线程B将读取更新后的值,本质上是这样的:内存模型有效。


重新排序现象分为编译器优化、指令级并行和内存系统重新排序,这可能会导致多线程中出现微妙的问题。JMM使用细粒度规则(例如存储负载屏障)来管理和停止可能导致问题的特定重新排序。例如,StoreLoad屏障确保内存访问顺序的全局一致性,即使在多处理器架构中也是如此。


内存模型的关键概念

JMM作为语言级抽象来提供跨平台内存可见性。处理器重新排序可能会导致内存操作以与预期不同的顺序执行。编译器通过引入内存屏障指令来保持一致性,例如LoadLoad、StoreStore、LoadStore和StoreLoad屏障是最全面的,并确保内存操作的顺序一致性,尽管这可能会增加处理器开销。


JSR-133引入了happens-before的概念,它定义了操作之间的内存可见性。此概念并不强制操作按特定顺序执行,而是要求先前的操作对后续操作可见。events-before关系与JMM密切相关,简化了理解内存重新排序的复杂性。数据依赖关系分为三种类型,编译器和处理器遵循这些规则来确保单线程程序的执行顺序保持不变。


重新排序和多线程示例

在多线程编程中,重新排序可能会破坏线程B读取的共享变量的值,尤其是在线程A更新控制依赖项之后。处理器执行推测执行,这可能会导致多线程中出现意外结果。正如同步示例所示,JMM确保正确同步的代码遵循顺序一致性,即所有线程执行的操作顺序保持一致。


JMM通过互斥执行来限制关键部分的重新排序,同时允许编译器和处理器执行性能优化。对于没有正确同步的程序,JMM提供了内存可见性的基本保证,但不保证完全符合顺序一致性模型。这些差异体现在单线程操作的顺序、long/double类型的原子性以及处理器总线机制可能导致的非原子读写上。


在内存可见性方面,比如计算圆面积的例子,JMM保证涉及内存操作的代码给所有线程提供一致的结果。JMM简单总结如下:


在地区区号中,发生前关系是A->B、B->C对结果没有影响,JMM强调这些关系对于理解记忆模式至关重要。
JMM区分影响执行结果的重新排序和允许优化的重新排序。第一个应该停止,而第二个可以在确保稳定性的同时优化性能。
JMM设计图强调其内存可见性保证的简单性以及对编译器和处理器的最小约束。

内存可见性的本质价值在于正确同步的代码可以保证执行结果的一致性,无论是单线程还是多线程。同时,JMM对不完全同步的场景提供了基础的保护,保证不会出现不必要的问题。


最后,JSR-133引入的volatile和final关键字提高了内存可见性,保证了代码的正确性和初始化的安全性。总的来说,Java内存模型是一种平衡,旨在满足程序员的编程需求,同时保持与编译器和处理器优化的兼容性。


三、spark内存模型和执行计划过程

.storageFraction

执行执行Shuffle、Join、Sort等计算中的临时数据:
执行内存累积=(-300MB)*火花。fraction*(eFraction

其他:主要用于存储RDD转换操作所需的数据,如RDD依赖关系等信息:

ReservedMemory:系统保留。内存将用于内部Spark对象

堆外内存:一个是DirectMemory,另一个是JVMOverhead。