理解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. 方法区

  

猜你喜欢

转载自www.cnblogs.com/bloodthirsty/p/12123718.html
今日推荐