1.线程与JVM
2.JVM内存模型与Java内存模型的区别
3.硬件内存架构与Java内存模型
4.Java内存模型对并发特征的保证

一、基本概念

程序:代码,完成某一件任务,代码序列(静态的概念)
进程:程序的一次运行(动态的概念)
线程:一个进程可能包含一个或多个线程(cpu分配资源的独立单位)

二、JVM与线程

JVM什么时候启动?

答: java类被调用时

JVM线程 --> 其他的线程(main) 线程在jvm中

JVM内存区域

方法区:
类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义。简单来说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中,虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做(Non-Heap)非堆,目的应该为了和Java的堆区分开(Jdk1.8以前hotspot虚拟机叫永久代,持久代,jdk时叫元空间)

堆:

  • 新生代(Young Generation)

    • 类出生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器回收,结束生命。
    • 新生代分为两个部分:
      • 伊甸区(Eden space)和幸存者区(Survivor space),所有的类都是在Eden space被new出来的。幸存区又分为From区和To区。当Eden区的空间用完时,程序又需要创建新的对象,JVM的垃圾回收器将Eden区进行垃圾回收(Minior GC),将Eden区中不再被其它对象引用的对象进行销毁。然后将Eden区中剩余的对象移到From Surivor区。如From Survior区也满了,再对该区进行垃圾回收,然后移动到To Survior区。
  • 老年代

    • 新生代经过多次GC仍然存活的对象移动到老年区,若老年代也满了,这时候发生Major GC(也可以叫 Full GC),进行老年区的内存清理。若老年区执行了Full GC之后依然无法进行对象的保存,就会抛出OOM(OutOfMemoryError) 异常。
  • 元空间

    • 在jdk1.8以后,元空间替代了永久代,它是对JVM规范中方法区的实现,区别在于元数据区不再虚拟机中,而是用的本地内存,永久代在虚拟机中,永久代的逻辑结构上也属于堆,但是物理上不属于。
    • 为什么移除永久代?
      • 参考官方解释:http://openjdk.java.net/jeps/122
      • 大概意思是移除永久代是为融合HotSpot与 JRockit而做出的努力,因为JRockit没有永久代,不需要配置永久代。

虚拟机栈:
Java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)不存在垃圾回收问题,只要线程一结束该栈就会释放,生命周期和线程一致

本地方法栈:
跟虚拟机的差不多

程序计算器:
就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常的小的内存空间,几乎可以忽略不计。

三、Java内存模型

全称 Java Memory model

JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。

主内存:线程共享的内存

工作内存:私有信息,基本的数据类型,直接分配到工作内存,引用的地址存放在工作内存,引用的对象放在堆中。

工作方式:

  • 1.线程修改私有数据,直接在工作空间修改
  • 2.线程修改共享数据,把数据copy到工作空间去,在工作空间修改,修改完成之后,在刷新到内存中去。

四、硬件内存与Java内存模型

硬件内存架构

该内存架构带来的问题:

1.CPU缓存的一致性问题:并发处理的不同步
2.解决方案:

  • 总线加锁 缺点:降低CPU的吞吐量
  • 缓存上的一致性协议(MESI)
    • 当cpu在cache中操作数据时,如果该数据是共享变量,数据在cache读到CPU的寄存器中,进行新修改,并更新内存数据cache, LINE置无效,其他的cpu就从内存中读数据。

五、Java内存模型的必要性

java内存模型的作用:规范内存数据和工作空间数据的交互

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

  1. 原子性:不可分割 x=1
  2. 可见性:线程只能操作自己工作空间中的数据
  3. 有序性:程序中的顺序不一定就是执行的顺序

编译重排序,指令重排序,提高效率

as-if seria:单线程中重排后不影响执行的结果

多线程:
happens-before

JMM对三个特性的保证

1.JMM与原子性

  • a. X=10 写 原子性 如果是私有数据具有原子性,如果是共享数据没原子性(读写)

  • b. 表达式:y=x 没有原子性

    • 把数据X读到工作空间(原子性)
    • 把X的值写到Y(原子性)
  • c. i++ 表达式 没有原子性

    • 读i到工作空间
    • +1;
    • 刷新结果到内存

多个原子性的操作合并到一起没有原子性
保证方式:
synchronized关键字,JUC Lock的lock

  1. JMM与可见性

volatile关键字 在JMM 模型实现MESI协议
synchronized 加锁
JUC Lock的lock

  1. JMM与有序性

volatile关键字
synchronized关键字

happens-before原则:

  • 程序的次序原则
  • 锁定原则:后一次加锁必须等前一次解锁
  • volatile原则:不允许重排序
  • 传递原则:A–B—C 推导 A – C

参考文章:
深入理解JVM-内存模型(jmm)和GC - 简书

并发概念模型:JMM(JAVA内存模型) - Dorami - 博客园

Java并发-JMM内存模型相关推荐

  1. java并发编程--内存模型

    1.内存模型 1.1.高速缓存 程序运行过程中,将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行运算就可以直接从高速缓存中读取数据和写入数据,当运算结束之后将高速缓存中的数据刷新到 ...

  2. JMM内存模型详解(一)

    本文开始死磕JMM(Java内存模型)由于知识点较多,分来写 该文为JMM第一篇 技术往往是枯燥的,本文文字较多 1. JMM是什么? 其实JMM很好理解,我简单的解释一下,在Java多线程中我们经常 ...

  3. JMM内存模型如何为并发保驾护航

    一.为何引入JMM 每个处理器在执行任务时,不可能单靠"计算"就可以完成所有任务,处理器至少需要和内存交互,进行读取运算数据.存储运算结果等,这个I/O操作是很难消除掉的.但由于计 ...

  4. 深入理解并发内存模型||JMM与内存屏障||多核并发缓存架构 ||JMM内存模型||volatile 关键字的作用 ||JMM 数据原子操作||JMM缓存不一致的问题

    深入理解并发内存模型||JMM与内存屏障 多核并发缓存架构 JMM内存模型 volatile 关键字的作用 JMM 数据原子操作 JMM缓存不一致的问题

  5. java——JMM内存模型

    目录 简介 三大特性 volatile关键字 简介 JMM内存模型,也称为Java多线程内存模型.它和cpu缓存模型类似,是基于cpu缓存模型来建立. cpu缓存模型: java内存模型: 当Java ...

  6. JUC多线程:JMM内存模型与volatile内存语义

    一.JMM 内存模型: 1.什么是 JMM 内存模型: Java 内存模型是 Java 虚拟机定义的一种多线程访问 Java 内存各个变量的访问规范,主要围绕如何解决并发过程中的原子性.可见性.有序性 ...

  7. 最新详细的JMM内存模型(三天熬夜血肝)

    知识图谱 前言 网上并发以及JMM部分的内容大部分都特别的乱,也不好整理.花了三四天时间才整理了一篇,有些概念的东西,是需要了解的,也标注出来了. 标注:在学习中需要修改的内容以及笔记全在这里 www ...

  8. 用volatile的视角,来打开JMM内存模型

    文章目录 [引言] 1. 多核并发缓存架构 CPU缓存 JMM内存模型简介 2. JMM内存模型验证 volatile验证内存模型 JMM内存模型8大原子操作 3. JMM缓存不一致问题 总线加锁 M ...

  9. 学习笔记【Java 虚拟机④】内存模型

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

最新文章

  1. PowerDesigner脚本使用记录
  2. 2022年轻人潮流爱好报告:被朋友圈高赞的神秘爱好,不烧钱还能脱单
  3. mds算法 java_对OAF开发中的MDS的初步研究(转)
  4. VS2010扩展VAX的安装使用
  5. 企业级技术与大数据BI——节选自专著《Big Data Fundamentals: Concepts, Drivers Techniques》
  6. CentOS7安装nfdump+nfsen+sflow 实现流量监控
  7. 借助智能手机应用程序和可穿戴设备在夏季塑造身材
  8. 显示商品分类列表页面
  9. 20200329——剑指offer 面试题49:丑数
  10. 【渝粤题库】陕西师范大学202015 法律职业伦理 作业
  11. [NOIP 2015TG D2T3] 运输计划
  12. 【车位检测】基于计算机视觉实现停车场空位识别附matlab代码
  13. sql server 2000安装程序配置服务器失败
  14. linux中病毒排查步骤,linux系统下病毒排除思路
  15. Axios 接收导出文件流
  16. Java中String类的运算符过载机制
  17. 【小白学爬虫连载(1)】-爬虫框架简介
  18. windows7 小工具(win7桌面整理工具)
  19. 2.MATLAB利用“基2时间抽选法”实现FFT
  20. 东芝停电13分钟 6000000TB硬盘没了

热门文章

  1. 2021年高压电工复审模拟考试及高压电工实操考试视频
  2. 中国的天使投资人升级了?
  3. linux如何挂载光驱和usb设备
  4. 说说Android的广播(4) - 前台广播为什么比后台广播快?
  5. 【悟空云课堂】第十四期:使用已破解或危险的加密算法导致的漏洞(CWE-327: Use of a Broken or Risky Cryptographic Algorithm)
  6. springcloud gateway网关直接给前端返回json数据
  7. 一个屌丝程序猿的人生(二十九)
  8. oracle12c收缩临时表空间,Oracle12CRAC关于临时表空间的一点启示
  9. ORA-01704: string literal too long
  10. 【探测服务】接口自动化之拨测落地