Java内存区域

Java内存区域

1.程序计数器

线程私有的内存,一块较小的内存空间,是当前程序所执行的字节码的行号指示器。字节码解释器在工作时,通过改变程序计数器的值来选取下一条字节码指令来执行。
每个线程都需要拥有独立的程序计数器,且彼此之间独立存储、互不影响,依次来保证线程切换后恢复到正确的执行位置。
如果执行的Java方法,计数器记录的是字节码指令的地址。如果是Native方法,计数器记录的是空。

2.Java虚拟机栈

线程私有的内存,生命周期与线程相同,描述的是Java方法执行的内存模型:每个方法在执行的同时,都会创建一个栈帧。存储局部变量表、操作数栈、动态链接、方法出口等。方法的调用——>完成,对应着栈帧在虚拟机中入栈——>出栈
定义有两种异常状态:a.线程请求的栈深度 > 虚拟机允许的深度,抛出*Error;b.虚拟机动态扩展时,无法申请到足够的内存,抛出OutOfMemoryError

3.本地方法栈

线程私有的内存,与虚拟机栈发挥的作用相似,区别在于虚拟机栈为虚拟机执行java方法服务,本地方法栈为虚拟机执行Native方法服务。也会抛出*Error和OutOfMemoryError异常

4.Java堆

线程共有,是JVM管理的内存最大的一块,虚拟机启动时创建。唯一的目的就是存放实例对象,几乎所有的对象实例都在这里分配内存。
Java堆是垃圾收集器管理的主要区域,也叫GC堆。异常状态OutOfMemoryError

5.方法区

线程共有,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。异常状态:OutOfMemoryError

6.运行时常量池

方法区的一部分,存放编译器生成的各种字面量、符号引用。异常状态当然也是OutOfMemoryError