组成部分
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 方法区
- 堆
前面三者为线程隔离的区域,后面两者为线程共享的区域
程序计数器
概述:较小的内存空间,当前线程执行字节码的行号指示器,每个线程之间相互独立
注意:在执行JAVA方法时,计数器记录的是字节码指令地址;在执行native方法是,计数器值为空
异常:唯一不会有OutOfMemoryError的区域
虚拟机栈
概述:JAVA方法(字节码)执行的内存模型,线程之间相互独立
方法运行时会创建一个栈帧(方法运行的基本数据结构)存储局部变量表、操作数栈等信息。
方法的调用到执行完成,对应着栈帧 入栈到出栈 的过程
局部变量表存储内容:基本数据类型和对象引用(指向对象初始地址的引用指针)
八大基本数据类型:byte、short、int、long、char、float、double、boolean
局部变量空间在编译时大小就固定了,运行时不会改变大小
64的long和double占用两个局部变量空间,其余都只占用1个空间
异常:StackOverFlowError、OutOfMemoryError
本地方法栈
概述:基本等同于虚拟机栈,只是执行的是native方法,线程之间也是相互独立的
异常:StackOverFlowError、OutOfMemoryError
JAVA堆
概述:管理内存中最大的一块,是被线程共享的区域,只要存放对象的实例。Java堆是垃圾收器的主要区域,又被称为GC堆。主要划分为新生代和老年代。
配置:-Xmx 和 -Xms控制大小
异常:OutOfMemoryError
方法区
概述:线程共享的区域,主要存储被加载的类信息、常量、静态变量、即时编译的代码。又被称为:非堆(Non-heap)。
在HotSpot虚拟机上,被称为永久代。原因是垃圾收集行为较少,主要是常量池的回收和类型的卸载。
配置:-XX:MaxPermSize
异常:OutOfMemoryError