几个概念
java内存结构,也叫jvm内存结构,也可以叫也就是运行时的数据区域
内存模型
1、内存结构,
A、栈
栈和线程紧密关联的。当创建线程的时候,会创建java栈,java栈又包含多个帧栈,方法运行的时候,信息就存在帧栈里面,比如局部变量,返回值,操作数等。Java栈数据不是线程共有的,所以不需要关心其数据一致性,也不会存在同步锁的问题
B、堆
存放对象实例,以及数组,垃圾回收主要针对的就是这个区域,这里的数据是线程共享的,所以不是线程安全的
C、方法区
类相关信息,例如类成员变量,方法名,等信息,当然包括类名,描述等信息,方法区还包括常量池,存放的是字符串,字面量等
D、程序计数器
由于java是多线程的,线程来回切换,程序计数器执行会指向帧栈的栈定,以表示程序执行到什么位置了。
E、本地方法栈
和栈相似,只不过执行的java外部的方法,比如c++的方法。
2、内存模型
java内存模型主要程序房屋变量的规则,也就是java虚拟机中的变量是如何存储到主存中,以及如何从主存中取到虚拟机中的这些细节。JMM规定了JMM规定了所有的变量都存储在主内存(Main Memory)中。每个线程还有自己的工作内存(Working Memory),线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量,数据交换必须通过主存。
Java内存模型是围绕着并发编程中原子性、可见性、有序性这三个特征来建立的,
可见性,主内存中的数据修改,工作内存是可见的。立即知道。
有序性,主要是针对多线程执行时候,线程的一些操作一些先后的规则,这就是before-happen。例如volatile修饰的变量,写操作先发生于读操作,
所以衡量并发安全问题一切必须以happens-before 原则为准。