一、所有线程共享的数据区
1.Java堆(Java Heap)
Java堆是虚拟机所管理的内存中最大的一块,在虚拟机启动时创建,它是几乎所有对象实例的存放区域,也是GC管理的主要区域
2.方法区(Method Area)
存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,GC在这个区域比较少出现
3.运行时常量池(Runtime Constant Pool)
运行时常量池是方法区的一部分,在类加载后,编译期生成的各种字面量和符号引用会进入运行时常量池存放
二、线程隔离的数据区
1.程序计数器(Program Counter Register)
可看作当前线程所执行的字节码的行号指示器,所以每个线程都需要一个独立的程序计数器,以便线程切换后能恢复到正确的执行位置
2.Java虚拟机栈(Java Virtual Machine Stacks)
线程私有,生命周期与线程相同,每个方法在执行时都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口等信息
3.本地方法栈(Native Method Stack)
与虚拟机栈类似,为执行Native方法服务
三、直接内存
直接内存(Direct Memory)是Java虚拟机规范定义的内存区域之外的内存,NIO可以使用Native函数库直接分配堆外内存,避免在Java堆和Native堆中来回复制数据,提高了性能