我眼中的Java内存模型

一.JVM内存结构

         

 (1)方法区只是一种概念上的区域,并说明了其应该具有什么功能,但是没有规定这个区域到底应该处于何处,不同版本的方法区所处位置不同,并不是绝对意义上的物理区域。

 (2)运行时常量池用于存放编译器生成的各种字面量和符号应用,但是java语言并不要求常量只有在编译器才能产生。比如在运行期,String.intern也会把新的常量放入池中。

二.Java内存模型

java内存模型是根据英文Java Memory Model (JMM),它只是一个抽象的概念,JMM和多线程相关,表述了一组规则和规范,这个规范定义了一个现成对共享变量的写入时对另一个线程可见的。

Jav的多线程之间时通过共享内存进行通信的,而由于采用共享内存进行通信,就会出现原子性,可见性,顺序性问题,而JMM就是围绕多线程通信以及与其相关的一系列特性而建立的模型,JMM定义了一些语法集,这些语法集就是java语言中的volatile 和 synchonized等关键字。

在JMM中,我们把多个线程间通信的共享内存叫主内存,而在并发编程中多个线程都维护了一个自己的本地内存(这是个抽象概念)其中保存的数据时主内存中的数据拷贝,而JMM主要是控制本地内存和主内存直接的数据交互。

 三.JAVA对象模型

虚拟机中,设计了一个OOP-Klass Model ,OOP 指的是普通对象指针,而Klass用来描述对象实例的具体类型。

每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示Java类,当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据。

 

四 java内存模型详解

        1.为啥会有java内存模型?

                计算机执行程序的死后,指令都是在cpu里面执行的,执行又要哥数据打交道,数据放在主存当中,就是计算机的物理内存。 随着CPU技术的发展,CPU的执行速度越来越快,内存就跟不上啦,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会越来越大,这就导致CPU每次操作都要等待内存的结果。

        这时候,我们想出来一个办法,就是在CPU和内存之间增加高速缓存,缓存的特点就是速度快,内存小,主要是贵!接下来程序执行就变成了:当程序在运行过程中,会讲运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从他的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。

而随着CPU能力的不断提升,一层缓存就慢慢的无法满足要求了,就逐渐的衍生出多级缓存。

按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存(L1),二级缓存(L3),部分高端CPU还具有三级缓存(L3),每一级缓存中所储存的全部数据都是下一级缓存的一部分。这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。那么,在有了多级缓存之后,程序的执行就变成了:当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。

现在CPU都呦多个核心,每个核心都含有一套L1设置L2缓存,而共享L3缓存。

 随着计算机能力不断提升,开始支持多线程。那么问题就来了。我们分别来分析下单线程、多线程在单核CPU、多核CPU中的影响。

单线程。 cpu核心的缓存只被一个线程访问。缓存独占,不会出现访问冲突等问题。

单核CPU,多线程。 进行中的多个线程会同事访问进程中的共享数据,CPU将某块内存加载到缓存中,不同线程在访问相同的物理地址的时候,都会映射到相同的缓存位置,这样即便发生线程的切换,缓存仍然不会失效,但由于任何时刻只能有一个线程在执行,因此不会出现缓存访问冲突。

多核CPU,多线程。每个核都至少有一个L1缓存,多个线程访问进程中的某个共享内存,且这多个线程分别在不同的核心上执行。则每个核心都会在各自的cache中保留一份共享内存的缓冲,由于多喝是可以并行的,可能会出现多个线程同时写各自的缓存的情况,而各自的cache之间的数据就有可能不同。

在CPU和主存之间增加缓存,在多线程场景中就可能存在缓存一致性问题,也就是说,在多核CPU中,每个核的自己的缓存中。关于同一个数据的缓存内容可能不一致。

 在多线程场景下会存在缓存一致性问题,除了这种情况,还有一种硬件问题也比较重要,那就是为了使处理器内部的运算单元能够尽量的被充分利用,处理器可能会对输入代码进行乱序处理,很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值