写写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 等特殊的处理;接下来还会持续更新!

相关文章
|
3月前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
64 6
|
2月前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
53 0
|
3月前
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
1天前
|
存储 IDE Java
java设置栈内存大小
在Java应用中合理设置栈内存大小是确保程序稳定性和性能的重要措施。通过JVM参数 `-Xss`,可以灵活调整栈内存大小,以适应不同的应用场景。本文介绍了设置栈内存大小的方法、应用场景和注意事项,希望能帮助开发者更好地管理Java应用的内存资源。
16 1
|
7天前
|
Java Shell 数据库
【YashanDB 知识库】kettle 同步大表提示 java 内存溢出
【问题分类】数据导入导出 【关键字】数据同步,kettle,数据迁移,java 内存溢出 【问题描述】kettle 同步大表提示 ERROR:could not create the java virtual machine! 【问题原因分析】java 内存溢出 【解决/规避方法】 ①增加 JVM 的堆内存大小。编辑 Spoon.bat,增加堆大小到 2GB,如: if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms512m" "-Xmx512m" "-XX:MaxPermSize=256m" "-
|
2月前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
56 8
|
2月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
102 5
|
2月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
2月前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。

热门文章

最新文章