Java内存模型
Java虚拟机规范中试图定义一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的访问效果。
Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。
1、java内存模型:java代码是运行在java虚拟机之上的,由java虚拟机通过解释执行(解释器)或编译执行(即时编译器)来完成。故java内存模型也就是指java虚拟机的运行时模型。
![](https://images2017.cnblogs.com/blog/1143814/201708/1143814-20170810162310355-1501908412.png)
从图中可知,内存分为两类:共享数据区和线程私有。
(1)线程私有区
a、程序计数器:一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。记录正在执行的虚拟机字节码的地址,每个线程都需要一个独立的程序计数器。
如果线程正在执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是native方法,这个计数器值则为空。
b、虚拟机栈:方法执行的内存区,每个方法执行时会在虚拟机栈中创建栈帧用于存储变量表、操作数栈、动态链接、方法进出口等信息。
c、本地方法栈:虚拟机的native方法执行的内存区。
(2)共享数据区
a、堆:java堆是java虚拟机所管理的内存中最大的一块。java堆是被所有线程共享的一块区域,在虚拟机启动时创建。此区域的唯一目的就是存放对象实例。
java堆是垃圾收集器管理的主要区域,很多时候也称为GC堆。
java堆可以处于物理上不连续的内存空间,之要逻辑上是连续的即可。大小可固定也可扩展。
b、方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
——常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用。
参考书籍 《深入理解Java虚拟机》 机械工业出版社 周志明著