主要列出运行时数据区域
方法区、堆、虚拟机栈、本地方法栈、程序计数器。
程序计数器
看作当前线程所执行字节码的行号指示器,通过改变计数器的值来选取下一条需要执行的指令。
执行java方法时,计数器记录的是字节码指令的地址,执行native方法时,计数器的值为空(Undefined)。
每条线程一个计数器,互不影响,独立存储,线程私有。
此区域没有规定OutOfMemoryError。
虚拟机栈
每个方法执行的同时会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、出口信息。
局部变量表存放编译器可知的基本数据类型、对象引用。
可以抛出栈溢出(StackOverflow)和内存溢出(OutOfMemoryError)异常。
线程私有。
本地方法栈
与虚拟机栈类似,为本地方法服务。可以抛出栈溢出(StackOverflow)和内存溢出(OutOfMemoryError)异常。
线程私有。
Java堆
存放对象实例。
可以抛出内存溢出(OutOfMemoryError)异常。
线程共享。
方法区
存放类信息,常量,静态变量
运行时常量池:存放字面量和符号引用。