Java虚拟机内存分为以下:
- 程序计数器
- Java虚拟机栈
- 本地方法栈
- Java堆
- 方法区
- 运行时常量池
程序计数器
线程私有内存
程序计数器是一块较小的内存空间,可以看做是当前程序执行字节码的行号指示器。字节码解释器工作时通过改变计数器的值来选取下一条需要执行的字节码指令。
Java虚拟机的多线程通过线程轮流切换并分配处理器执行时间来实现,在任一时刻,一个处理器(多核处理器的一个内核)都只会执行一条线程中的指令,所有为了线程切换后能正确执行,每条线程都有一个独立的程序计数器。
执行Native方法时,计数器的值为空(Undefined)
该内存区域是唯一个Java虚拟机没有规定任何OutOfMemoryError情况的区域
Java虚拟机栈
线程私有内存
生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个栈桢,用于存储局部变量表,操作数栈等。一个方法从调用到执行完毕的过程对应一个栈桢在虚拟机栈中出栈入栈的过程。
本地方法栈
为虚拟机调用Native方法服务
Java堆 (GC堆)
线程共享内存
存放对象实例,几乎所有的对象实例都在这里分配内存。 Java虚拟机规范中描述:所有的对象实例以及数组都在堆上奉陪。
方法区
线程共享内存
用于存储已被虚拟机加载的类信息,常量,静态变量和即时编译器编译后的代码等数据。
运行时常量池
用户存储编译器生成的各种字面量和符号引用,运行时也可能将新的常量放入。