java内存模型


线程和JVM

1、基本概念

  1. 程序:是一组指令的有序集合,本身没有任何运行的含义,只是一个静态的实体
  2. 进程:指具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个基本单位
    程序和进程的区别和联系:
    1、程序是静态的,进程是动态的,有自己的生命周期,反应了一个程序在一定的数据集上运行的全部动态过程。
    2、进程和程序也不是一一对应的。一个程序运行在不同的数据集上就称为不同的进程。一般来说一个进程会有一个与之对应的程序,而且只有一个。而一个程序可以没有进程,也可以有多个进程
  3. 线程:线程是进程的一个实体,是CPU调度和分派的基本单位。线程基本上不拥有系统资源,只具有一些在运行中必可不少的资源。
    线程和进程的区别和联系:
    1.进程在执行过程中拥有独立的内存单元,而多个线程共享内存。所以在同一进程下的多个线程更容易进行通信。
    2.一个程序至少有一个进程,而一个进程至少有一个线程。
    3.进程是资源分配的最小单位,线程是程序执行的最小单位。

2、JVM和线程

  1. JVM的一次运行最基本的资源占有单位也是线程
  2. JVM的启动流程
    1、类被调用->JVM线程->其他线程

3、JVM内存区域

在这里插入图片描述

方法区:类信息、常量、static、jit(及时编译)
堆区:实例对象
VM stack:java方法在运行的内存模型(局部变量、引用类型时间的地址、操作数栈)
PC:java线程的私有数据。

4、 Java内存模型 JMM(抽象的概念)

  1. 主内存:共享的信息
  2. 工作内存:私有信息、基本数据类型、引用对象的地址
  3. 工作方式:
    1、线程修改私有数据,直接在工作空间修改
    2、线程修改共享数据,把数据复制到工作空间,然后在工作空间进行修改,修改完后才能后刷新共享内存的数据

5、 硬件内存架构和内存模型

5.1、 硬件架构
  1. CPU获取数据的方式:
    CPU <=> CPU寄存器 <=> Cache(一级、二级、三级缓存) <=> 内存
  2. 并发时出现的问题:
    1、CPU缓存的一致性问题(典型的i++):并发处理,导致数据的不同步
    解决方案:
    1、总数加锁 减低CPU的吞吐量
    2、缓存上的一致性协议(MESI):当CPU在chche中操作数据时,如果该数据是共享变量,就将该数据读到寄存器中进行修改,并更新内存数据,并将该Cache中数据标志为不可读,其他cpu就必须冲内存中读数据。
5.2 java内存模型和硬件的关系

JVM工作空间可能存在的数据:CPU寄存器、cache、主内存的数据
JVM主内存可能存在的数据:CPU寄存器、cache、主内存的数据
注意:工作空间和主内存数据存在相同,就可能导致数据不一致的问题。

5.3 Java内存模型的必要性

JMM作用:就是规范内存数据和工作空间数据的交互

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

  1. 原子性:指一个操作不可中断,不受其他线程的干扰。
  2. 可见性:线程只能操作自己操作空间中的数据
  3. 有序性:因为程序中的顺序不一定就是执行的顺序,所以需要保证有序性

JMM对三个特征的保证

  1. JMM和原子性
    1)x=10 当操作私有数据时是原子操作,共享数据时不是原子操作
    2)x=y 不是原子操作,但是他拆分的每个操作都是原子操作
  2. JMM和可见性
  1. volatile:在JMM模型上实现了MESI的协议
    2)synchronized:通过锁来实现
  1. JMM和有序性
    1)Happen-Before规则
    1.1 程序次序原则
    1.2 锁定原则
    1.3 volatile原则
    1.4 传递原则: A–B--C=>A–C
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值