理解JMM及volatile关键字
Posted bloodthirsty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解JMM及volatile关键字相关的知识,希望对你有一定的参考价值。
一、Java内存区域
从《深入理解Java虚拟机》一书中知道
1. 程序计数器
当前线程的行号指示器,JVM多线程的方式,导致了线程在被挂起到重新获取执行权时,需要知道上次挂起的地方在哪。在JVM中,
通过程序计数器来记录字节码的执行位置。程序计数器具有隔离性,为线程私有。此区域不会发生OOM。
2. Java虚拟机栈
Java虚拟机栈描述的是Java方法执行的内存模型:每一个方法执行时将创建一个栈帧,存储局部变量表、方法出口等信息。每一个方
法从调用到执行完成,对应的是栈帧的入栈出栈的过程。
局部变量存储基本类型、对象引用和returnAddress类型。局部变量包括boolean、byte、char、short、int、float、long、double,其中
long和double占两个局部变量空间,其余的占一个。对象引用可以是对象的引用指针,也可以是对象的句柄或者与此对象相关的地址。
Java虚拟机栈为线程私有。
3. 本地方法栈
线程私有,这部分存放虚拟机调用的Native方法,一般情况下,我们无需关心。
4. Java堆
Java堆的唯一目的就是存储对象实例,是线程的共享区域。
Java堆是垃圾收集器管理的主要区域,因此又称为“GC堆”。从内存回收的角度,又分为:新生代和老年代,再细致一点,又分为:
Eden空间、From Survivor空间、To Survivor空间。如果堆中没有内存完成实例分配,并且堆无法扩展,将会OOM。
5. 方法区
以上是关于理解JMM及volatile关键字的主要内容,如果未能解决你的问题,请参考以下文章
搜集了这么多资料,不信你还理解不了 JMM 内存模型volatile 关键字保证有序性和可见性实现原理!