java内存模型和jvm运行时数据区对应起来谈的疑惑

在java内存模型中有工作内存和主内存,主内存是所有线程共享的内存区域,
规定变量都必须存储在主内存中。但是在jvm运行时数据区中,又谈到所有局部
变量都存储在栈中,而栈又是线程私有的,对应到内存模型中就是工作内存。
相应主内存对应的就是运行时数据区的堆。这不就产生了矛盾吗?**对与局部变
量到底是按照内存模型来说存储在主内存中,还是栈中呢?**

局部变量是放到jvm栈中的,全局变量应该在主内存中。

jvm内存模型和java内存模型是两回事。 java内存模型是为了解决多线程对共享数据访问保持一致性,即规定了jvm怎么协调虚拟内存和主内存关系

对于JMM与JVM本身的内存模型,参照《深入理解Java虚拟机》周志明的解释,这两者本没有关系。如果一定要勉强对应,那从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中的对象实例数据部分,而工作内存则对应于虚拟机栈中的部分区域,。从更低层次上说,主内存就是物理内存,而为了获取更好的执行速度,虚拟机(甚至是硬件系统本身的优化措施)可能会让工作内存优先存储于寄存器和高速缓存中,因为运行时主要访问—读写的是工作内存

局部变量应该存在哪?
存在主内存——多线程共享——但局部变量是线程独有的——矛盾!
存在工作内存——不符合jmm规定——矛盾!

一个线程有一个工作内存,而又有一个主内存,由所有线程共享,如果一个变量在一个线程里定义,并且只给自己用,他就只用存在自己的工作内存,如果
还给了其他线程用了,就需要把这个变量放在主内存里来共享

Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

所有变量,全局的和局部的都存储在主内存中,线程的私有的工作内存存有自己局部变量和全局变量的拷贝
JVM控制共享变量的值同步

Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行。