浅谈jvm和JMM内存模型

浅谈jvm和JMM内存模型

每每回看jvm设计以及cpu设计都忍不住膜拜行业大佬,虽然有相思之处,但是各有各个闪光点。
下面是自己参考大量资料总结出来的jvm jmm 以及cpu以及与cpu设计后总结出来的理解。
首先我们一定要记得jvm和jmm java内存模型是两个东西。很多行业小白或者面试官自己都分不清,就拿去面试,大多数java程序员都知道我们jvm的内存结构,当面试官问你内存模型你巴拉巴拉说一堆内存结构,如果没有及时纠正你的话可能就会一直犯错到有一天有人发现你。(本人就是,自己曾一度认为内存模型就是那些堆栈计数器啥的。)

一、jvm内存结构

当谈到jvm内存结构时,我自己总结了一个口诀方便自己记忆,“一区一器一堆两栈”。每个组件发挥的作用其实你看个两遍应该能记得住这些是干什么,其实这个是java这门语言的根基。
在这里插入图片描述

1.一区:一区代表的是方法区,方法区其实就是放我们字节码的地方,这里顺带一下啊class的加载过程 验证-》链接-》初始化。这个方法区放的其实就是我们class被jvm编译过的字节码,这样方便我们计算机做指令运算。
2.一器:一器代表的是 计数器 计数器其实在多线程的情况下才能完全大展神威。因为我们cpu进行指令执行的时候是可能被多个线程抢夺执行权。这就需要我们计数器去记录我们上一个线程执行到哪一条指令了,方便下次这个线程其拿到了cpu的执行权它再接着执行。
3.一堆:一堆代表的是jvm里面的堆内存这里存放的是java虚拟机实例化对象出来的对象,这里提一嘴,我们的new 对象的时候不是线程安全的 因为他不是原子性操作 1分配内存 2.初始化变量 3.赋值 。值得注意的是垃圾回收的主要区域就是堆空间
4/5.两栈本地方法栈和栈,虚拟机栈指的是运行空间,是对象cpu的执行内存,本地方法栈指的是java虚拟机启动时会加载一些自己那些native方法,然后通过执行殷勤做运算,具体就是下面这个东东,里面是用c语言和c++写的一些方法因为我们java语言没有直接与硬件交互的资格。
在这里插入图片描述

二、JMM内存模型
jmm研究的是多线程下java代码的执行顺序,共享变量的读写规则。
首先我们在认识jmm的前提,我们必须认识到两个事实:
1.你写的代码,未必是实际运行的代码。
2.代码的编写顺序未必是实际执行顺序。
为什么?其实这都是一系列为了性能做出的妥协,我们的代码执行在cpu上最终都是以指令进行的,如果是运算就做加减乘除,如果是判断就做一个判定(后面cpu工作原理详解),为了这个运算达到巅峰 jvm 和cpu、 系统都对我们编写的代码动了手脚(第一次看到这里真的那个心情想骂人,瞎J*动老子代码)但是随着理解的深入,其实更多的是崇拜这些又爱又恨的前辈。
为了达到性能的巅峰,我们的jvm虚拟机对我们的代码进行了指令重排,称作jit指令重排
这里使用了osr技术(热点代码替代技术),意思就是我们我们的jvm编译代码的时候当达到某一个阈值的时候初始化某一个变量的时候不再去主内存拿最新的值这就导致如果有其他线程修改了数据私有内存是拿不到最新值得
在这里插入图片描述
2.第二种是流水线指令重排,其实这种不算是指令重排
在这里插入图片描述
这个图看起来可能比较晦涩一点假定c指令对于ab有依赖,我们可以多new 几个线程去执行如图所示我们只要取第三流水线得第一步的值相加就可以完美得到a+b+c,但是为了效率更加明显系统内部还做了流水线执行步骤得优化,这么做纯粹就是以空间换取时间
3.第三种是cpu的代码优化
这里大体带过一下cpu的原理
在这里插入图片描述
这里的运算器就是为我们做了运算和判定的处理.具体组件的作用请向我们的度娘请教

针对上述一系列代码执行顺序被改动我们的jmm提别指定以下规则

1.形成竞态条件(至少又一个线程在运行)
2.happenesbefore简称HB
3.SYCHORNIZED order 同步动作要保证运行顺序是编写顺序,必须用 锁来保证
4.因果律
5.安全发布。如果要安全发布对象,并将其共享使用,需要用final 和volitle修饰其变量,并避免this溢出的情况
6.静态成员变量可以安全发布

总结:

其实多线程情况下抢占锁的就是为了抢占cpu的执行权,为了让线程间又个高效的合作分工,所有的锁都是基于内存屏障实现的,每个内存屏障的实现各个cpu生产厂家是不一样的,因特尔,联发科等,这里我们不去刨内存屏障的祖坟了 但是我们要知道内存屏障的作用,这个如果我们有幸参与jvm的开发会有很大用处。完结撒花!嘿嘿嘿。个人学习总结难免有遗漏或者错误,如果您觉得文章对您有帮助请举起您发财的大拇指点个赞再走,如果您觉得文章有什么错误的地方,欢迎您的指正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值