1. 程序计数器,可以看作是当前线程所执行的字节码行号指示器。
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,任何一个确定的时刻,一个处理器都只会执行一条线程的指令,每条线程都一个独立的程序计数器。个线程的计数器互不影响,独立存储,这类内存为线程私有的内存。
2. Java虚拟机栈
线程私有内存,生命周期与线程相同。每个方法在执行的同时都会创建一个栈帧。
通常会把Java的内存区分为堆内存和栈内存,这个栈指的就是虚拟机栈中局部变量表部分。局部变量表存放了编译器可知的基本数据类型,对象引用和returnAddress类型(指向了一条字节码指令的地址)。
3. 本地方法栈
虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到得Native方法服务。
4. Java堆
Java Heap是虚拟机管理的内存中最大的一块,被线程共享的一块区域,用于存放对象实例。Java堆可以处于物理上不连续的内存空间,只要逻辑上是连续的即可。
5. 方法区
是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
该区域的内存回收目标主要是针对常量池的回收和类的卸载。
6. 运行时常量池
它是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
7. 直接内存
不属于Java虚拟机规范中定义的内存,在JDK 1.4中的NIO类中使用,显著提高了性能。