java虚拟机在执行java程序时,会将它所管理的内存划分为若干个不同的数据区域
1,程序计数器
程序计数器是指当前线程所执行的字节码的行号指示器,即存储的是下一条需要执行的字节码指令。为了在多线程中,线程切换能恢复到正确的执行位置,每个线程都需要一个独立的程序计数器
2,java虚拟机栈
Java虚拟机栈是线程私有的。Java虚拟机栈描述的是Java方法执行的内存模型。每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息
3,本地方法栈
本地方法栈中执行的是Native方法。在HotSpot中,将Java虚拟机栈和本地方法栈合二为一。
4,堆
Java堆是被所有线程共享的一块内存区域。几乎所有的对象实例和数组都在这里分配内存。也是gc回收的主要区域
5,方法区
方法区是各个线程共享的区域,它用于存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
6,运行时常量池
运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。这部分内容将在类加载之后进入到方法区的运行时常量池中存放。Java语言并不要求常量只有编译器产生,运行期间也可将新的常量放入池中。
7,直接内存
在jdk1.4之后新加入了NIO,可以使用native函数库直接分配堆外内存(本机内存),然后通过一个存储在java堆中的directByteBuffer对象作为这块内存的引用进行操作。避免了io在java堆和native堆来回复制数据