JVM 内存模型
Java内存模型(Java Memory Model ,JMM)是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。
简要言之,jmm是jvm的一种规范,定义了jvm的内存模型。它屏蔽了各种硬件和操作系统的访问差异,不像c那样直接访问硬件内存,相对安全很多,它的主要目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。可以保证并发编程场景中的原子性、可见性和有序性。
五大内存区域:
-
程序计数器(program counter register):线程私有, 程序计数器是很小的一块内存空间,可以认作为当前线程的行号指示器。
在cpu的一个核心 在某一既定时刻只会执行一条线程中的指令,然而线程中会存在多个指令,为了cpu处理不同线程指令时,线程切换回来可以定位(或者时恢复)到正确的执行位置,那么这个时候就需要每个线程都做一个独立的记号,这个记号就叫做程序计数器。不同线程的程序计数器是独立存储,互不干扰的。
当线程执行某个java方法时,程序计数器记录的是虚拟机自己吗指令的地址。如果是native方法(底层方法),计数器为空。
程序计数器所处内存区域,是虚拟机规范中唯一没有OutOfMemoryError的区域。
为方便理解,举个现实中的例子: 线程1 叫 小明 ,线程 2 叫 小红,小明和小红 去 小餐馆 吃饭, 餐馆只有一个厨师(Cpu核心),小明点了 鸡腿,汉堡,薯条,小红点了可乐,猪蹄,面条。然后他们拿着各自的小票(程序计数器?)找座位等待上餐。厨师只能一样一样的做,做好服务员拿着对应的菜品,然后上一样用笔在小票上划一样,然后看下个应该上的菜品是什么,然后进行处理。意思大概就是这么个意思。
-
Java栈(JVM Stacks):线程私有,每个方法执行的时候都会创建一个栈帧,用于存放:局部变量表(Local Variable),操作栈(Operand Stack),动态链接(Dynamic Linking),方法出口等信息。
- 本地方法栈(Native Method Stacks):线程私有,Java栈存放的是Java方法(字节码)相关信息,而 本地方法栈存放的是 虚拟机所要使用到的一些native方法信息。
- 堆(HEAP):线程共享的, 所有的对象实例以及数据都要在堆上分配内存。也就是所有new 出来的都在堆里。
- 方法区(Method Area):线程共享。用于存储:已被虚拟机加载的类信息,常量,静态变量