Java内存模型

1 基本概念:

程序:代码,完成某一件任务,代码序列(静态的概念)
进程:程序在某些数据上的一次运行(动态的概念)
线程:一个进程可能包含一个或多个线程(占有资源的独立单元)

2 JVM与线程

JVM什么时候启动?
类被调用时 JVM线程启动 ----> 启动其他的线程(main)
线程在JVM中

3 JVM内存区域

在这里插入图片描述
方法区:类信息(由类加载器classload加载)、常量、static 、JIT(java及时编译) (方法区和堆区信息共享)
Java堆区:实例对象 GC(垃圾回收器) (方法区和堆区信息共享) (OOM:Java内存溢出)
VM stack:Java方法在运行的内存模型 (OOM:Java内存溢出,栈帧放满了)
在这里插入图片描述
PC(程序计数器):java线程的私有数据,这个数据就是执行下一条指令的地址
Native method stack(本地方法栈): 与JVM的native方法有关,用其它语言写的方法。

4 Java内存模型 Java memory model JMM(规范,抽象的模型)

用来指导规范数据交互。
在这里插入图片描述
1)主内存:共享的信息
2)工作内存:私有信息,基本数据类型,直接分配到工作内存;引用类型,引用的地址存放在工作内存,引用的对象存放在堆内存中
3)工作方式:
A 线程修改私有数据,直接在工作空间修改
B 线程修改共享数据,把数据复制到工作空间中去,在工作空间中修改,修改完成以后,刷新内存中的数据

JVM就是按照JMM规范来划分的
JMM是一个模型,是一种逻辑概念,而JVM是实际操作中按照JMM模型将内存划分的结果。
JVM内存区域的VM stack和PC 就是指JMM中的工作空间
VM stack的大小可以设置,不设置的话有一个默认的大小

5 硬件内存架构与java内存模型

1)硬件架构
在这里插入图片描述
a)CPU缓存的数据不一致性问题:并发处理的不同步
b)解决方案:
i.总线加锁(地址总线,数据总线,控制总线) 降低了CPU的吞吐量
ii.缓存上的一致性协议(MESI)
当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据
CaCHE LINE置无效,相当于告诉其它cpu我把共享变量的数据修改了,其它cpu不要去从自己的缓存读这个共享变量,其他的CPU要从内存中读数据。

2)Java线程与硬件处理器
在这里插入图片描述
3)Java内存模型与硬件内存架构的关系
在这里插入图片描述
交叉:数据的不一致

4)Java内存模型的必要性
Java内存模型(JMM)的作用:规范内存数据和工作空间数据的交互

6、并发编程的三个重要特性

原子性:不可分割 x=1
可见性:线程只能操作自己工作空间中的数据
有序性:程序中的顺序不一定就是执行的顺序
编译重排序
指令重排序
都是为了优化提高效率

/**
 * as-if-seria原则:单线程中重排后不影响执行的结果,多线程也是这样。
 * happens-before原则
 **/

7、JMM对三个特征的保证

1)JMM与原子性
A)X=10 写 原子性 如果是私有数据具有原子性,如果是共享数据没原子性(读写)

B)Y=x 没有原子性
a) 把数据X读到工作空间(原子性)
b) 把X的值写到Y(原子性)

C)I++ 没有原子性
a)读i到工作空间
b)+1;
c)刷新结果到内存

D)Z=z+1 没有原子性
a)读z到工作空间
b)+1;
c)刷新结果到内存

多个原子性的操作合并到一起没有原子性

保证方式:
Synchronized(同步的)
JUC(指java.util包下的三个工具类:java.util.concurrent、java.util.concurrent.atomic、java.util.concurrent.locks) Lock的lock

2)JMM与可见性
Volatile:在JMM模型上实现MESI协议
Synchronized:加锁
JUC Lock的lock

3)JMM与有序性

Volatile:
Synchronized:
Happens-before原则:
1)程序次序原则
2)锁定原则 :后一次加锁必须等前一次解锁
3)Volatile原则:霸道原则
4)传递原则:A—>B —>C A–>C

总结:
JVM内存区域和JMM的关系
JMM和硬件的关系
JMM和并发编程三个重要特征(有序性 as-if-seria happens-before )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值