JMM和JVM的区别

it2023-08-20  70

在面试的时候我经常被问到JVM内存模型,我一直以为JVM也就5大区域,线程共享的方法区(包含运行常量池),堆和线程私有的本地方法栈,和虚拟机栈还有程序计数器。当问道JMM我下意识觉得可能是在问JVM。其实不是,二者本来不是一个东西。 JVM是java实现的虚拟计算机,(Java Virtual Machine),既然是虚拟实现的计算机,那么它也有对应的存储区,这就是刚才说的那些堆,栈等等。 JMM是什么?JMM的主要目的是定义程序中各种变量的访问规则,变量包含实例字段和静态字段,但是不包括局部变量和方法参数。也就是说管理的是线程共享的,线程私有的是不需要管理的。众所周知现代计算机都包含多处理器,多个处理器之间共享主内存,极大的提高了计算机的运行效率。为了提升性能会在每个处理器上增加一个小容量cache(高速缓存,容量小但是速度快)加快读写,但是这样导致了缓存的一致性问题,为了解决缓存一致性问题又引入了了一系列的cache一致性协议(MSI,MESI,MOSI,Synapse,firefly等),用来保证CPU本地缓存和主内存数据的一致性。 举个例子: JVM管理下的存储空间(堆、栈等)相等于物理机的内存 线程私有的存储区对应的就相当于物理机的cache 而JMM就对应的一些列保证缓存一致的协议,用于定义读写的规则。 JMM相对于物理机的缓存一致性协议来说还有自身独有的问题,重排序问题。 指令重排序: 为了提高性能,编译器和处理器通常会堆指令进行重排序,重排序指的是从源代码到指令序列的重新排序,分为三种。 1.编译器优化的重排序,编译器在不改变单线程程序语义的前提下可以重拍指令语句的执行顺序。 2.指令级并行的重排序,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 3.内存系统的重排序。

最新回复(0)