Java程序设计语言、虚拟机、API类库——>JDK
API 类库中SEAPI子集和虚拟机——>JRE
1.程序计数器:当前线程执行的字节码的行号指示器。针对java方法,如果是Native方法,计数器值为空。
唯一一个没规定OutOfMemoryError的区域。
2.java虚拟机栈:java方法执行的内存模型,方法执行同时创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口灯信息。经常意义上说的“栈内存”指虚拟机栈中的局部变量表。局部变量表存放了编译期可知的各种基本数据类型、对象引用类型。
会抛出StackOverflowError异常(请求栈深度大于所允许的深度);OutOfMemoryError异常(可动态扩展时无法申请到足够内存)。
3.本地方法栈:使用Native方法服务。虚拟机栈执行Java方法(字节码)服务。
会抛出StackOverflowError异常和OutOfMemoryError异常。
4.java堆:虚拟机启动时创建,存放对象实例,几乎所有对象实例在这里分配内存,可用于物理内存不连续逻辑连续的内存空间。是垃圾收集器管理的主要区域,也称为GC堆。
会抛出OutOfMemoryError异常。
5.方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。这区域的回收目标主要是针对常量池的和对类型的卸载。
*运行时常量池:方法区的一部分,用于存放编译期生成的各种字面量和符号引用。运行期间也可能将新的常量放入池中。会抛出OutOfMemoryError异常。
*直接内存:JDK1.4中新加入NIO(NewInput/Output)类,引入一种基于通道与缓冲区的I/O方式,可以使用Native函数库直接分配堆外内存。会抛出OutOfMemoryError异常。