java内存空间与内存模型

内存空间分为五大部分:线程私有内存的 【栈】 【native栈】 【寄存器】 + 线程共有的 【堆】 【方法区】

内存模型有三个特性:【可见性】 【原子性】 【有序性】

 

jvm内存空间:管理的内存空间可以分为以下五个区域

1.程序计数器(寄存器):线程私有的内存空间,记录着当前线程执行指令的情况,例如指定到哪一条字节码

2.栈:线程私有的内存空间,保存了是 基本数据类型(int, long)、对象引用和returnAdress,可以看做局部变量表

详解:

1)一个线程对应一个栈

2)每运行一个方法就创建一个栈帧(stack frame),每个栈帧会保存方法的 局部变量、操作栈和方法返回值等信息

3)当一个方法执行完成时,对应的栈帧就会弹出栈帧保存的元素作为这个方法的返回值,并且清除这个栈帧

4)Java栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法的栈,程序计数器也会指向该地址

5)只有这个活动的栈帧的本地变量可以被操作栈使用

6)当在这个栈帧中调用另外一个方法时,与之对应的一个新的栈帧被创建

7)这个新创建的栈帧被放到Java栈的栈顶,变为当前的活动栈

8)当这个栈帧中所有指令都完成时,这个栈帧被移除Java栈,刚才的那个栈帧变为活动栈帧

9)如果线程请求的栈深度大于虚拟机所允许的深度,将抛出 StackOverflowError

10)如果虚拟机栈可以动态扩展,在扩展时无法申请到足够的内存,就会抛出OutOfMemoryError

3.native方法栈:线程私有的内存空间,和栈类似,不过栈保存的是java方法的局部变量,native方法栈保存的是native方法的局部变量

4.堆:所有线程共享的内存区域,一般也是jvm内存区域最大的,保存了所有对象实例和数组,也是gc工作的主要区域

5.方法区:所有线程共享的内存区域,线程不安全,保存了静态变量、final常量、类信息(类名、修饰符)、field信息、method信息,gc活动没有堆区域活跃

常量池:方法区的一个部分

6.实例:Object obj = new Object()

1)Object 的类信息存储在 方法区

2)obj 作为一个reference 类型数据,存储在栈帧中

3)new Object()在堆中得到分配的内存空间

4)寄存器记录着当前执行的指令地址,即执行到当前代码所在的方法

 

主内存与工作内存

1)所有变量(指的是静态变量,局部变量是存储在线程私有的栈空间中因而无需考虑)都存储在主内存中

2)线程的工作内存会把需要用到的主内存中的变量拷贝到工作内存,该线程对变量的操作都是对工作内存中变量拷贝的副本进行操作

3)线程1和线程2要想进行数据的交换一般要经历下面的步骤:

    1.线程1把工作内存1中的更新过的共享变量刷新到主内存中去

    2.线程2到主内存中去读取线程1刷新过的共享变量,然后copy一份到工作内存2中去。

 

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

1)原子性(Atomicity):一个操作不能被打断,要么全部执行完毕,要么不执行

    1.synchronized来保证方法和代码块内的操作是原子性

    2.在32位jvm中,对64位基本类型的long、double进行读写操作时,实际上是线程不安全的

2)可见性:一个线程对共享变量做了修改之后,其他的线程立即能够看到(感知到)该变量这种修改(变化)

    1.volatile变量值修改后,新值立刻同步到主内存

    2.每次使用volatile变量前立即从主内存中刷新

    3.因此volatile保证了多线程之间的操作变量的可见性,而普通变量则不能保证这一点

    4.synchronize、lock和final也可以保证可见性

3)有序性

    1.在多线程并发时,程序的执行就有可能出现乱序

    2.用一句话可以总结为:在本线程内观察,操作都是有序的;如果在一个线程中观察另外一个线程,操作是无序的

    3.前半句是指“线程内表现为串行语义(WithIn Thread As-if-Serial Semantics)”

    4.后半句是指“指令重排”现象和“工作内存和主内存同步延迟”现象

    5.两个关键字volatile和synchronized来保证多线程之间操作的有序性

    6.volatile关键字本身通过加入内存屏障来禁止指令的重排序

    7.synchronized关键字通过一个变量在同一时间只允许有一个线程对其进行加锁的规则来实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值