1.程序计数器
(1)JVM通过线程轮流切换并分配处理器执行时间来实现多线程。
(2)程序计数器一块较小的内存空间,用来存储当前字节码执行的位置,为线程独立私有
(3)不会发生OutOfMemoryError异常
2.Java虚拟机栈
(1)线程私有。
(2)每个方法被执行时都会在其中创建一个栈帧,用来存储局部变量,操作数栈,方法出口等信息。
(3)编译期间完成分配,局部变量表中的数据大小是已知的,运行期间不改变大小。
(4)局部变量表存储8种基本类型和对象引用
(5)double和long会占用两个栈空间,其他占一个
3.本地方法栈
(1)为虚拟机使用到的Native方法服务
(2)线程私有
(3)HotSpot将其与虚拟机栈合二为一
4.堆
(1)所有线程共享
(2)所有对象实例以及数组都要在其中分配内存
(3)物理上可以不连续,逻辑上连续
(4)分为Eden区,From Survivor区,To Survivor区
5.方法区
(1)存储已被虚拟机加载的类信息,常量,静态变量
(2)线程共享
5.1运行时常量池
(1)方法区的一部分
(2)常量池用来存放编译器生成的字面量和符号引用,类加载后转移存放到运行是常量池中
6.直接内存
NIO包可以使用Native函数库在堆外分配内存,受本机内存大小限制