Java内存模型和Java内存结构精读

以前看过很多遍JVM相关知识的文章,无非都是直接来张图片开搞,一来就甩张图片上来,这是方法区,这是堆,这是线程独享的一堆堆的概念,看得真的是头大,死记硬背也记不下来,更别说理解了。

最近一段时间在看jvm相关的知识点,这是我唯一一次觉得底层逻辑这么清晰的一次,下面总结一下我的学习心得。

学习jvm之前,一定要先去了解一下cpu的内存模型,如果你连CPU的内存模型都没有了解,直接开干Java的内存模型,什么jvm,垃圾回收啊,劝你别费劲了,死记硬背很快就忘了,我承认确实能记下来,但凭我学习下来的感悟,我觉得我的学习流程没错!

CPU内存模型

首先介绍一下CPU内存模型,要想学虚拟机的内存模型你总得了解物理机的吧。
在单核时代,CPU只做运算,最终数据的存储是放在主存里面的,也就是电脑的内存条,可是CPU运算能力非常强悍,相对来说,每次计算过后将数据存入主存中就会有一次io,严重影响性能,而且内存处理速度跟CPU相比不在一个量级上,所以后面加入了高速缓存来作为中间媒介,CPU将数据运算后放入高速缓存中,高速缓存会存储主存中的部分数据,CPU想获取数据时先从高速缓存中获取,获取不到再去主存拉取下来,存储的时候就会先存放在缓存中,随后再去同步到主存中,这将CPU的能力达到了最佳状态!
在硬件的发展过程中,单CPU已经几乎达到了能力上限,为了提升性能,便通过横向扩展的方式,进入了多CPU时代;
CPU扩展过后,便引入了新的问题,以前所有的数据都是放在主内存中,而多个CPU的情况下,不同的CPU处理数据过后同步到主存中便会出现数据不一致的问题,在这样的问题下,缓存一致性协议便有了它的用武之地,所以后面在主存和高速缓存之间加入了缓存一致性协议,做到了数据一致性,如下图!
Java内存模型和Java内存结构精读_第1张图片
以上就是对CPU的简单介绍。下面来谈一谈Java的内存模型!

Java内存模型

当你理解了CPU的内存模型过后,再来看Java的内存模型,你会发现这一切都是那么相似,先出图
Java内存模型和Java内存结构精读_第2张图片
Java内存模型是分为了主内存和工作内存,主内存和CPU的主内存一样,共享所有的数据,工作内存只有执行的线程才能进行操作访问,跟CPU的原理就是一个样的,在Java里面工作内存与内存之间的交互有着8个指令,分别是read、load、store、write、lock、unlock、assign、use
这几个之间是有规律可循的

当你想要把数据从主内存中读取到工作内存中的时候,你肯定是先read再load,所以这两者是成对出现的;
当你想要把数据从工作内存中写到主内存的时候,你就需要先执行store再就是write,这两者也是成对的;
当你想要对共享变量加锁访问时,你肯定使用到的就是lock来加锁,使用unlock来释放锁;
当你在工作内存中对某一对象赋值时,你就需要使用到assign;
当你使用对象时就需要用到use。

Java内存模型和Java内存结构精读_第3张图片

其实很好理解,只要记住了CPU的内存模型,再结合就知道了Java的内存模型,按顺序操作就知道了这8个指令。

Java内存结构

当你把Java内存模型理解了,那就可以开始探究Java内存结构了,Java内存结构无非就是说存在于主存和工作内存中分别有哪些;
别人总是会说线程共享,独占啥的,现在你理解了吧。

线程共享(主内存):堆、方法区(常量池)
线程私有(工作内存):虚拟机栈、本地方法栈、程序计数器

这一眼看来不就明了了吗!

这样一总结,再仔细想想,肯定是主内存的区域是最大的,所以要发生垃圾回收,内存溢出之类的多半就在这里面出现了,因为线程执行结束后他所占有的空间也就消失了(不绝对,这部分我还没研究到),垃圾回收后面学习后再进行总结。

eg:该文章是我通过学习后通过自己的白话进行的思路和方法的总结,如果想了解更深的知识可以前往链接文章学习;如有哪点说错,欢迎指出!

你可能感兴趣的:(Java,Java分享,学习,Java内存模型,CPU内存模型,Java内存结构,java)