00:00/00:00

1.堆(Heap)
运行时的数据区,堆是由垃圾回收来负责的,可以动态地分配内存的大小,数据的生存期也不必告诉编译器,GC机制会自动回收不与要的数据,速度会慢一些,原因是运行时动态分配内存,用来存放对象的引用。
2.栈(Thead Stack):
存取速度比堆要快,仅次于CPU的寄存器。栈的数据是可以共享的,但生存期必须是明确的。栈存放基本数据类型和对象句柄。jmm要求调用栈和本地变量存放在线程栈上。一个本地变量持有对象的引用,那么该本地变量可以访问对象的成员变量。

多核cup访问 内存原理:
1,cpu读取主存顺序
主存-->cpu缓存-->cpu内部寄存器
2,cpu写入主存顺序
cpu内部寄存器-->cpu缓存-->主存

线程中的通信必须经过主内存
所以每个线程之间都是如下的循环操作

如果多个线程访问过程中
不对主内存中的变量进行控制,那么会引发并发问题。

CPU 多级缓存

1、为什么需要多级缓存
cpu 的频率太快了,快到主存跟不上,在处理器时钟周期内,cpu 常常需要等待主存,浪费资源,缓存的出现是为了缓解cpu和主存之间速度不匹配的问题

总体上 cpu的速度大于缓存的速度大于主存的速度

2、cpu 多级缓存的缓存一致性MESI

用于保证多个缓存之间的数据一致性
M:modify 修改
E:exclusive 独享
S : shared 共享
I : invalid 无效的
缓存的目的是为了减少cpu访问共享主存的次数
一个缓存除了在I状态外 都可以完成cpu的读请求
一个cpu新请求如果在请求写一个缓存行操作 ,那么只有在这个缓存行是M/E状态才能执行,S的话需要等待变为I,在执行,解决同时修改共享数据而不一致
CPU 为了提高速度 会对代码进行乱序优化,所以代码写的先后,并不代表会一定先后执行。 指令重排序的问题常常发生在没有数据依赖的环境下,一个方法里面对共享变量的操作,如果这个操作让jvm觉得没有数据依赖则会从排序,从排序之后会改变业务逻辑。例如多核多级缓存共同读写一个变量即使逻辑代码是有先后顺序,但是执行顺序可能不同就导致了并发问题。

You Might Also Like

No Comments

Leave a Reply