JVM将内存组织为主内存和工作内存两个部分。

主内存是所有的线程所共享的,主要包括本地方法区和堆。

每个线程都有一个工作内存不是共享的,工作内存中主要包括两个部分:

1:一个是属于该线程私有的栈;

2:对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓存区)。

1.所有的变量都存储在主内存中(虚拟机内存的一部分),对于所有线程都是共享的。

2.每条线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,
线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。
3.线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成,即:线程、主内存、工作内存。

JVM规范定义了线程对内存间交互操作:

Lock(锁定):作用于主内存中的变量,把一个变量标识为一条线程独占的状态。

Read(读取):作用于主内存中的变量,把一个变量的值从主内存传输到线程的工作内存中。

Load(加载):作用于工作内存中的变量,把read操作从主内存中得到的变量的值放入工作内存的变量副本中。

Use(使用):作用于工作内存中的变量,把工作内存中一个变量的值传递给执行引擎。

Assign(赋值):作用于工作内存中的变量,把一个从执行引擎接收到的值赋值给工作内存中的变量。

Store(存储):作用于工作内存中的变量,把工作内存中的一个变量的值传送到主内存中。

Write(写入):作用于主内存中的变量,把store操作从工作内存中得到的变量的值放入主内存的变量中。

Unlock(解锁):作用于主内存中的变量,把一个处于锁定状态的变量释放出来,之后可被其它线程锁定。

在将变量从主内存读取到工作内存中,必须顺序执行read、load;
要将变量从工作内存同步回主内存中,必须顺序执行store、write。
8种操作必须遵循以下规则:

1:不允许read和load、store和write操作之一单独出现。即不允许一个变量从主内存被读取了,但是工作内存不接受,或者从工作内存回写了但是主内存不接受。
2:不允许一个线程丢弃它最近的一个assign操作,即变量在工作内存被更改后必须同步改更改回主内存。
3:工作内存中的变量在没有执行过assign操作时,不允许无意义的同步回主内存。
4:在执行use前必须已执行load,在执行store前必须已执行assign。
5:一个变量在同一时刻只允许一个线程对其执行lock操作,一个线程可以对同一个变量执行多次lock,但必须执行相同次数的unlock操作才可解锁。
6:一个线程在lock一个变量的时候,将会清空工作内存中的此变量的值,执行引擎在use前必须重新read和load。
7:线程不允许unlock其他线程的lock操作。并且unlock操作必须是在本线程的lock操作之后。

8:在执行unlock之前,必须首先执行了store和write操作。

JAVA 内存模型(主内存,工作内存)的更多相关文章

  1. java内存模型中工作内存并不一定会同步主内存的情况分析

    其实是为了填之前的一个坑  在一个多线程的案例中出现了阻塞的情况. https://www.cnblogs.com/hetutu-5238/p/10477875.html   其中的第二个问题,即多个 ...

  2. Java内存模型-volatile的内存语义

    一 引言 听说在Java 5之前volatile关键字备受争议,所以本文也不讨论1.5版本之前的volatile.本文主要针对1.5后即JSR-133针对volatile做了强化后的了解. 二 vol ...

  3. 【java】java内存模型(2)--volatile内存语义详解

    多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”.可见性的意思是当一个线程 ...

  4. JAVA内存模型与JVM内存结构

    问题:什么事java内存模型? 首先呢不要答堆.栈.方法区.这是JVM的内存结构.下面阐述了JMM和JVM的区别和自己对JMM的见解 1.Java内存模型(JMM):即多线程相关的.定义了一个线程对另 ...

  5. Java 内存模型和硬件内存架构笔记

    前言 可跟<主存存取和磁盘存取原理笔记>串着看 https://blog.csdn.net/suifeng3051/article/details/52611310 杂技 Java 内存模 ...

  6. Java并发编程里的volatile。Java内存模型核CPU内存架构的对应关系

    CPU内存架构:https://www.jianshu.com/p/3d1eb589b48e Java内存模型:https://www.jianshu.com/p/27a9003c33f4 多线程下的 ...

  7. Java内存模型、JVM内存结构和Java对象模型

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存 ...

  8. 04-JVM内存模型:直接内存

    1.1.什么是直接内存(Derect Memory) 在内存模型最开始的章节中,我们画出了JVM的内存模型,里面并不包含直接内存,也就是说这块内存区域并不是JVM运行时数据区的一部分,但它却会被频繁的 ...

  9. 内存模型 Memory model 内存分布及程序运行中(BSS段、数据段、代码段、堆栈

    C语言中内存分布及程序运行中(BSS段.数据段.代码段.堆栈) - 秦宝艳的个人页面 - 开源中国 https://my.oschina.net/pollybl1255/blog/140323 Mem ...

  10. Redis内存模型(1):内存统计及划分

    1. 内存统计 查看命令:info memory 示例: 部分含义: used_memory: Redis分配器分配的内存总量(单位是字节),包括使用的虚拟内存. used_memory_rss: R ...

随机推荐

  1. 07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染

    Flutter实战(交流群:452892873) 本项目是一个实战项目,根据目录建文件,并复制从第一节到最新更新的文章,可以构成完整的一个请求后台数据的项目: CateModel.dart class ...

  2. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_09-freemarker基础-内建函数

    可以理解为freemaker提供的一些函数和方法 controller里面记得把map的数据注释去掉,.放开代码 工程需要重启下 <br/> 学生的个数: ${stus?size} < ...

  3. easy-mock 本地部署

    前言 为什么要本地部署 easy-mock呢? easy-mock官网经常挂,太浪费时间了: 公司突然不给上外网,太垃圾了: 就是想要折腾自己,太爱学习了(哈哈哈): Easy-mock 官网 安装需 ...

  4. Jenkins创建镜像后无法推送到harbor的问题

    https://blog.csdn.net/mydeman/article/details/79042848 1.先切换到root账号,用root登录harbor,就可以push $ sudo pas ...

  5. Jmeter 逻辑控制器 之 Runtime Controller

    一.认识 Runtime Controller  控制其下样例执行的时间长度. 设置界面:  Runtime (seconds):运行时间,单位秒.即控制其下样例执行多长时间.与线程组中的调度器的持续 ...

  6. centos(linux)-jdk配置

    1.清理系统默认自带的jdk 在安装centos时,可能系统会默认安装了例如openjdk等,需要先手动卸载 先执行:rpm -qa | grep jdk (查看已经自带的jdk): 卸载命名:sud ...

  7. solr后台操作Documents之增删改查

    偶尔会用到solr后台操作一些数据,比如测试等一些情况.但具体用的时候可能会忘记,或者搜的时候结果不全,在此略详细的记一下. 1.添加 {"id":6,"title&qu ...

  8. php-fpm的参数优化

    查看php-fpm的内存占用 1.查看php-fpm的进程个数 ps -ef |grep "php-fpm"|grep "pool"|wc -l 2.查看每个p ...

  9. docker安装mongodb和redis

    一.安装mongodb docker pull mongo docker run -p 27017:27017 -d --name mongodb01 mongo docker run -p 2701 ...

  10. SQL SERVER 字符串函数 REPLACE()

    定义: REPLACE()返回用另一个字符串值替换原字符串中出现的所有指定字符串值之后的字符串. 语法: REPLACE ( string_expression , string_pattern , ...