写写Java 内存模型

简介: JMM 并发编程必须要理解的重中之重

概述

最近朋友面试,让我帮忙模拟下面试。在这个过程中,突然想到了Java 内存模型,顺便问了一下,朋友的回答是JVM 的运行时数据区的内存分布。虽然我知道这不是想要的答案,但我不知道Java 内存模型是什么,虽然不知道也不是不能工作。但是谁让面试卷呢?


因为一些不可控的原因,我也要找工作了,就赶紧把这个不会的内容搞清楚吧。


由于Amdahl 定律代替摩尔定律成为计算机性能发展源动力,导致并发处理的广泛应用。现在我们的cpu 都是多processor 的,也是遵照了Amdahl 定律。用多个处理器来提升pc 的运行效率。当然,我们有多个核心执行代码,而内存只有一块儿,那就需要提升自己并发编程的能力,让软件更好的适用硬件提升效率。


当多个processor 处理同一个共享内存资源时,Java 是如何处理的呢?

image.jpeg

为此Java 提出了内存模型 JMM


JMM定义

JMM 属于语言级的内存模型,它确保在不同的编译器和不同的处理平台之上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。


image.jpeg


Java 的并发采用的是共享内存模型,Java 线程之间的通信总是隐式进行的,整个通信过程对我们是完全透明的。Java 线程之间的通信由Java 内存模型控制,JMM 决定一个线程共享变来给你的写入何时对另一个线程可见。JMM 通过控制主内存与每个线程的本地内存之间的交互,来为我们提供内存可见性保证。


主内存与工作内存交互的8个步骤

◆lock(锁定):作用于主内存的变量,把一个变量标识为一条线

程独占状态

◆ unlock〔解锁):作用于主内存的变量,把一个处于锁定状态

的变量释放出来,释放后的变量才可以被其他线程锁定

◆read(读取):作用于主内存的变量,把一个变量值从主内存

传输到线程的工作内存中,以便随后的load动作使用

◆load(载入):作用于工作内存的变量,它把read操作从主内

存中得到的变量值放入工作内存的变量副本中

◆use(使用):作用于工作内存的变量,把工作内存中的一个变

量值传递给执行引擎

◆ assign(赋值):作用于工作内存的变量,它把一个从执行引

擎接收到的值赋值给工作內存的变量

◆ store(存储):作用于工作内存的变量,把工作内存中的一个

变量的值传送到主内存中,以便随后的 write的操作

◆ write(写入):作用于主内存的变量,它把 store操作从工作内

存中一个变量的值传送到主内存的变量中


一个主内存中的共享变量想要到cpu 被processor 操作必须经过 read load use 这三个步骤并不具有原子性,这也就是为什么在并发场景下,没有合适的同步机制会出现错误的原因。这也就是程序员不得不理解JMM 的重要原因。


happens-before简介

在JMM 中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before 关系。这里提到的两个操作即可以是在同一个线程之内,也可以是不同线程之间。


简单的写了下自己有关JMM 的理解,但JMM 并不仅仅是上面的内容,还有对锁,volitale ,final 等特殊的处理;接下来还会持续更新!

相关文章
|
10天前
|
Java 编译器 开发者
深入理解Java内存模型(JMM)及其对并发编程的影响
【9月更文挑战第37天】在Java的世界里,内存模型是隐藏在代码背后的守护者,它默默地协调着多线程环境下的数据一致性和可见性问题。本文将揭开Java内存模型的神秘面纱,带领读者探索其对并发编程实践的深远影响。通过深入浅出的方式,我们将了解内存模型的基本概念、工作原理以及如何在实际开发中正确应用这些知识,确保程序的正确性和高效性。
|
29天前
|
监控 算法 Java
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,特别是垃圾回收(Garbage Collection, GC)机制。我们将从基础概念开始,逐步解析垃圾回收的工作原理、不同类型的垃圾回收器以及它们在实际项目中的应用。通过实际案例,读者将能更好地理解Java应用的性能调优技巧及最佳实践。
73 0
|
2天前
|
缓存 算法 Java
Java中的内存管理:理解与优化
【10月更文挑战第6天】 在Java编程中,内存管理是一个至关重要的主题。本文将深入探讨Java内存模型及其垃圾回收机制,并分享一些优化内存使用的策略和最佳实践。通过掌握这些知识,您可以提高Java应用的性能和稳定性。
14 4
|
1天前
|
Java 数据挖掘 数据库连接
Java使用直接内存的好处
综上所述,Java直接内存的使用为开发者提供了一种绕过JVM堆限制、直接高效操作内存资源的途径,特别适用于高吞吐量、低延迟和大规模数据处理的场景。虽然直接内存的使用需要更精细的管理以避免内存泄漏和过度消耗系统资源,但恰当的利用能够显著提升应用的性能表现,是现代高性能Java应用不可或缺的工具之一。
5 1
|
2天前
|
存储 监控 算法
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
|
23天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
6天前
|
监控 算法 Java
Java中的内存管理:理解垃圾回收机制
【10月更文挑战第2天】 在本文中,我们将深入探讨Java编程语言中的内存管理机制,特别是垃圾回收机制。我们将从基本原理、垃圾回收算法到实际应用场景全面解析,帮助你更好地理解和优化Java应用的内存使用。无论你是初学者还是有经验的开发者,这篇文章都能带给你新的启发和思考。
20 2
|
7天前
|
Java
java操作内存,简单讲解varhandle的使用
本文介绍了Java中VarHandle的使用,它是一种从JDK 9开始引入的用于高效访问对象字段的特性。文章通过示例代码展示了如何通过VarHandle操作对象的字段,包括设置和获取字段值,以及如何通过MethodHandles.lookup().findVarHandle()方法获取VarHandle实例。VarHandle提供了一种比反射更高效的内存操作方式,并且支持原子操作。
15 0
java操作内存,简单讲解varhandle的使用
|
8天前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
18 0
深入理解java对象的内存布局
|
19天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
76 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制