1.运行时数据区域
程序计数器:
占一块较小的内存空间
作用:当前线程所执行字节码的行号指示器
【每条线程都需要有一个独立的程序计数器,这类内存区域是线程私有的】
若执行的是java方法:计数器记录的是正在执行的虚拟机字节码指令地址
若执行的是Native方法:计数器值为空
这块内存区域是唯一一个没有规定任何OutOfMermoryError的区域
虚拟机栈:
它描述的是java方法执行的内存模型
每个方法被执行时都会同时创建一个栈帧,每一个方法被调用的过程对应着一个栈帧在虚拟机中从入栈到出栈的过程
由图可知,java虚拟机栈也是线程私有的
注:当进入一个方法时,这个方法需要在帧中分配多大的局部空间变量是完全确定的,在方法运行期间不会改变局部变量表的大小。
此块区域存在的异常有:StackOverflowError , OutOfMemoryError
本地方法栈:
与虚拟机栈发挥的作用非常相似
区别:虚拟机栈执行java方法,而本地方法栈执行native方法
堆:
被所有线程“共享”的一块内存区域,在虚拟机启动时创建,几乎所有的对象实例以及数组都要在堆上分配内存
且java堆可以于物理上不连续的内存空间,当前主流虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)
方法区:
是各个线程“共享”的内存区域(非堆)
用于存储已被虚拟机加载的类信息、常量、静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。