java内存模型

 

当我第一次见到java的内存模型时,心里在想为什么需要java内存模型,它可以见解决什么问题?,java的内存模型是如何进行设计的,带着这样的疑问我们就可以能够深入的理解java的内存模型。

1. 为什么需要java内存模型?

我们先了简单了解一下cpu和内存的关系,指令都是有由cpu进行执行的,那么数据的有什么进行管理的呢?是放在主存里面,也就是计算机的物理内存,但是随着计算里面的cpu处理速度的提高,对主存的操作表的越来越耗时。

这个就像一个刚刚成立的公司,只有CEO和员工,但是CEO的野心越来越大,员工的脚本已经跟不上了,这样就会产生一定的问题。那么如何解决这种问题?

这是就需要一个中间节来调节CEO和员工之间的关系(中层管理),也就是高速缓存,主要是把主存的数据放到高速缓存里面,cpu需要执行数据的直接从高速缓存里面取。

随着社会的进步,将会出现公司的规模越来越大,将会出现多个CEO,多个中层管理,但是它们员工还是一样的,将入出现一个CEO说我要这个员工进行加薪,一个CEO说,我要这个员工进行离职,这样就会产生分歧。也就产生单核cpu,多核cpu的使用情况,

在多个cpu和单核cpu情况下,如果同时出现多个线程来操作缓存数据,就有可能导致每一个线程对应的缓存数据不一定一样。这样就是我们所说的缓存不一致问题。

前面所说的就是cpu和主内存之间的缓存不一致问题,除了这个问题外,还有就是处理器为了使运算单元能够被充分利用,处理器可能会对输入代码进行乱序执行处理。这就是处理器优化。还有为了提高代码运行效率,进行指令重排序。

现在我们在来说一下,并发编程里面

并发编程里面比较常见的问题是:原子性,可见性,有序性。其实原子性,可见性,有序性问题是人们从底层抽象出来的概念,

它们其实就是处理器优化,缓存不一致问题,指令重排序。

所以,为了保证并发编程中可以满足原子性、可见性及有序性。有一个重要的概念,那就是——内存模型。

为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。

2.什么是java内存模型?

Java 程序是需要运行在 Java 虚拟机上面的,Java 内存模型(Java Memory Model,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了 Java 程序在各种平台下对内存的访问都能保证效果一致的机制及规范。

 

分析:这是java的内存结构,让我们先了解一下java内存结构每一个部分功能都是干什么?

java堆:java的堆内存时jvm里面最大一个内存,是所有java线程共享的区域,不是线程安全的,所有的对象实例和数组的创建都是在java的堆上面进行的,也是java回收的主要区域。

java栈:java栈是为了jvm执行java方法服务,java栈中数据不需要关心出问题,因为每一个线程对应一个栈。

本地方法栈:主要负责jvm执行native方法。

方法区:存放要加载的类的信息,类的静态变量,类中定义final类型的常量,类的成员信息,类的方法信息,可以通过class对象来获取类的基本信息,方法区是被线程所共享的,不会被GC频繁的进行回收。

程序计数器:保存当前程序执行的内存地址。因为java支持多线程的操作,程序执行不可能是线性执行的,当中断线程的程序时,必须保存程序的执行到哪里的内存地址,方便后面进行回复,每一个线程的程序计数器是线程私有的,互相不影响。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值