JAVA内存模型(JMM)和JAVA虚拟机内存模型(JVM)

影响数据可见性,写屏障会将线程工作内存的数据强制写入主内存,读屏障会强制从工作内存读取数据

可见性

指的是多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

1、保证可见性的手段——happens-before原则

如果 A happens-before B,那么 Java 内存模型则保证: A 操作的结果将对 B 可见,且 A 的执行顺序排在 B 之前

  • 程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。

  • 监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。

  • volatile 变量规则:对一个 volatile 域的写,happens- before 于任意后续对这个 volatile 域的读。

  • 传递性:如果 A happens- before B,且 B happens- before C,那么 A happens- before C。

2、 JAVA虚拟机模型(JVM)

=================

jvm规定的虚拟机内存分配模型

JDK8按照JVM规范的具体实现

 程序计数器


程序计数器是描述CPU运行的存储结构。CPU自带的存储介质是寄存器,CPU运行计算所需的任何数据都需要从寄存器获取。每个线程在创建后,都会产生自己的程序计数器和栈帧。

由于CPU的时间片轮转特性,一个线程承载的任务可能在一个CPU时间片内无法完成,此时操作系统会会随机选择下一个线程执行,因此需要程序计数器存放执行指令的偏移量和行号指示器等,线程执行或恢复都要依赖程序计数器。

生命周期:和线程同生共死,线程创建时诞生,线程结束时消亡

虚拟机栈


虚拟机栈是描述方法执行的存储结构,用后进先出的栈结构,按照方法执行顺序记录方法地址。每个线程的虚拟机栈的栈顶指示的就是所有活动方法列表。

生命周期:和线程同生共死,线程创建时诞生,线程结束时消亡

本地方法栈


本地方法栈和虚拟机栈实现的功能相同,只不过虚拟机栈是为虚拟机执行Java方法(也就是字节码)服务,本地方法栈则为虚拟机使用到的Native方法服务。

生命周期:和线程同生共死,线程创建时诞生,线程结束时消亡

堆内存


对象创建所需申请的空间,不要求磁盘的物理连续性,只要求逻辑连续性即可,所有线程共享的存储区域

方法区


方法区是JVM虚拟机规范,也称堆外内存。方法区是所有线程共享的存储区域,存放数据如下:类信息、常量、静态变量、即时编译器编译后的代码,其中常量存储在运行时常量池中。

当.java编译成.class文件后,除了会生成类名、字段、方法等信息外,还有就是常量信息(包含这个java类定义的各种常量字符串和符合引用),这个常量信息就会被放到运行时常量池中。

永久代是JDK7的HotSpot对于方法区的具体实现,元空间(Metaspace)是JDK8对于方法区的具体实现。元空间与永久代之间区别在于

1、元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制

2、符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap

之所以把数据存储从永久代转移到堆上,主要是为了尽量将变化和不变的分开,数据在堆上能有更好的垃圾回收效率。

直接内存


直接内存相当于跳过JVM直接向操作系统申请的内存空间,这不是JVM管控的内存空间,不会被垃圾回收。

优点:这片空间适用场景在于频繁的IO操作,因为申请Direct Memory就避免了在java堆和native堆的数据拷贝,减少了IO次数,提升了性能。

缺点:空间垃圾回收不归JVM管控

总结

线程共享角度来看内存的分配,堆内存、元空间、直接内存都是线程共享的,程序计数器、虚拟机栈、本地方法栈都是线程私有的。

JMM和JVM的关联

==========

  • JMM屏蔽了不同操作系统差异,是跨平台可用的内存模型,用来描述线程的数据在何时从主内存读取,何时写入主内存,解决线程间数据共享和传递的问题。

  • JVM用来描述Java程序运行过程中,对象创建所占用的不同内存区域,在线程级别定义了数据的共享性和私有性。例如:堆和方法区是共享数据的,PC寄存器、虚拟机栈、本地方法栈是线程独享的数据区域。

  • 二者在本质上并没有关联,毕竟是为解决不同问题而诞生。但以“先有鸡还是先有蛋”的角度来考虑这个问题,二者的关联可以简单理解,JMM描述的【工作内存】,就是JVM描述的【PC寄存器、虚拟机栈、本地方法栈】;JMM描述的【主内存】,就是JVM描述的【堆和方法区】
    参考文章
    Java内存模型原理
    Java内存模型(JMM)总结

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2020最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
cx-1710665049527)]

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。如有需要获取完整的资料文档的朋友点击我的GitHub免费获取。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值