java内存模型JMM笔记

内存模型是为了处理多核条件下多层缓存到缓存的数据一致性,定义程序中各个变量的访问规则的底层细节。
硬件有自己的内存模型。
Java内存模型与硬件内存架构之间存在差异,要进行桥接。

java内存模型 JMM (Java Memory Model)
JSR133的目的是为了修复原本JMM的一些缺陷而提出的
在处理器层面上,内存模型定义了一个充要条件,“让当前的处理器可以看到其他处理器写入到内存的数据”以及“其他处理器可以看到当前处理器写入到内存的数据”

JMM规定了所有的变量都存储在主内存(Main Memory)中。每个线程还有自己的工作内存(Working Memory),线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量(volatile变量仍然有工作内存的拷贝,但是由于它特殊的操作顺序性规定,所以看起来如同直接在主内存中读写访问一般)。不同的线程之间也无法直接访问对方工作内存中的变量,线程之间值的传递都需要通过主内存来完成

Java内存模型是围绕着并发编程中原子性、可见性、有序性这三个特征来建立的

内存模型又要涉及到内存结构
java内存结构图:
这里写图片描述
Java运行时数据区分为下面几个内存区域:
1.PC寄存器/程序计数器:
  严格来说是一个数据结构,每个线程都需要有一个独立的程序计数器。
2.Java栈 Java Stack:
与线程对应起来的,Java栈数据不是线程共有的,所以不需要关心其数据一致性,也不会存在同步锁的问题。
3.堆 Heap:
  堆是JVM所管理的内存中国最大的一块,是被所有Java线程锁共享的,不是线程安全的,在JVM启动时创建。
4.方法区Method Area:
  就是我们通常所说的Java堆中的永久区 Permanet Generation,是堆中的一部分。方法区存放了要加载的类的信息(名称、修饰符等)、类中的静态常量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。
5.常量池Constant Pool:
  常量池本身是方法区中的一个数据结构。常量池中存储了如字符串、final变量值、类名和方法名常量。
6.本地方法栈Native Method Stack:
  本地方法栈和Java栈所发挥的作用非常相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行Native方法服务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值