JAVA堆(Heap)
JAVA堆是JAVA虚拟机所管理的内存中最大的一块,被所有线程共享的内存区域,在虚拟机启动时创建,此内存区域唯一目的就说存放对象实例,几乎所有的对象实例都在这里分配内存
JAVA堆是垃圾回收器管理的主要区域
JAVA堆可以处于物理上不连续的内存空间,逻辑上连续即可,目前主流虚拟机都是可扩展的
(如果在堆中没有内存完成实例分配,并且堆无法再扩展时,将会抛出OutOfMemoryError异常)
方法区(Method Area)
与JAVA堆一样,线程共享的内存区域,用于储存虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
(JDK1.8之后彻底去除了方法区的概念,取而代之的是一个叫Metaspace(元空间))
程序计数器(Program Counter Register)
线程私有的内存
作用:当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令
JVM栈(JVM Stacks)
线程私有,生命周期与线程相同
虚拟机栈描述的是JAVA方法执行的内存模型:每个方法被执行时都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息
线程请求栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常
虚拟机栈扩展无法申请到足够的内存时会抛出OutOfMemoryError异常
本地方法栈(Native Method Stacks)
本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行JAVA方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务
本地方法栈中的方法使用的语言、使用方式与数据结构没有强制规定(与其它语言交互)