讲一讲JVM内存模型

首先JVM内存模型诞生的背景,因为为了发挥cpu最大的性能,我们引入了cpu缓存,从而出现了缓存带来的可见性问题,同时也引入了指令重排序,从而也出现了指令的顺序性问题,为了解决这些问题,硬件层面采用了内存屏障,MESI协议解决了这些复杂的执行逻辑问题,而在jvm层面,缓存问题就抽象成了工作内存和主内存的问题,各个线程拥有自己私有的工作内存,各个线程共享主内存里面的数据,同样的也存在了可见性等问题,而在jvm层面就推出了jvm内存模型来解决这些问题

jvm内存模型是一组规范,它规定了各个线程操作共享变量的顺序问题

最主要的规则体现在happens-before

程序顺序规则:指的是线程中的每个操作happens before于这个操作的后续操作

监视器锁规则:指的是对每个对象的解锁操作happens before于对这个对象的后续加锁操作

volatile变量规则:对volatile的写操作happens before与对这个对象的后续读操作

start规则:线程A对线程B的start操作happens before于线程B的任意操作

join规则:线程B 的任意操作happens before 于线程A执行线程B 的join方法成功返回

传递规则:如果Ahappens before 于B,Bhappens before于C,那么Ahappens before于C。

volatile是对JMM规则的部分实现,解决了以上可见性,有序性的问题

剩下的原子性问题的解决方案有:CAS ,  锁

CAS   (耗cpu,单个元素,ABA问题[时间戳 版本号解决])

具体实现在atomic等原子操作的封装类

Synchronized  同步关键字

AQS 抽象队列同步器

具体的在我的后续讲一讲系列都会有讲解.

JVMJava虚拟机)内存模型是指在JVM运行Java程序时,用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据的内存区域的结构。JVM内存模型包括以下几个主要部分: 1. 堆(Heap):堆是JVM所管理的最大的一块内存空间,它是所有线程共享的内存区域。几乎所有对象的实例以及数组都在这里分配内存。 2. 栈(Stacks):栈也称为虚拟机栈,是线程私有的内存区域。每个方法在执行时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。当方法执行完毕,栈帧就会被弹出栈。 3. 方法区(Method Area):方法区也是线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 4. 程序计数器(Program Counter Register):程序计数器是线程私有的内存区域,它是一个较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 5. 本地方法栈(Native Method Stacks):本地方法栈与虚拟机栈的作用相似,不同的是,本地方法栈是为了支持虚拟机使用本地(Native)方法服务的。 JVM内存模型的设计是为了支持Java语言的运行时特性,如自动内存管理(垃圾回收机制)、类加载机制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值