理解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关键字的主要内容,如果未能解决你的问题,请参考以下文章

全面理解Java内存模型(JMM)及volatile关键字

搜集了这么多资料,不信你还理解不了 JMM 内存模型volatile 关键字保证有序性和可见性实现原理!

Java并发多线程编程——volatile关键字

《我要进大厂系列 一》-说说你对volatile关键字理解

玩命死磕Java内存模型(JMM)与Volatile关键字底层原理

玩命死磕Java内存模型(JMM)与Volatile关键字底层原理