Java内存模型
程序计数器
程序计数器是一块比较小的内存空间。这块内存空间是线程私有的,程序计数器记录的是正在执行的虚拟机字节码的地址。(如果正在执行的本地(Native)代码,值为空(Undefined))。
Java虚拟机栈
Java虚拟机栈描述的是Java方法执行的内存模型。每个方法在执行的同时都会创建一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等信息。这个区域也是线程私有的。
局部变量表存放了编译器可知的各种基本数据类型、对象引用和returnAdress类型(指向了一条字节码指令的地址)。
long和double类型的数据会占用2个局部变量空间(slot),其余的数据类型只占用一个。局部变量表所需的内存空间在编译期间完成分配,进入一个方法时局部变量表所需的空间是确定的,在运行时不会改变。
这个区域可能会出现StackOverflowError异常和OutOfMemoryError异常。
本地方法栈
本地方法栈和Java虚拟机栈类似,区别就是这个区域为虚拟机使用到的Native方法服务。
这个区域也可能会出现StackOverError异常和OutOfMemoryError异常。
Java堆
Java堆是垃圾收集器的主要区域,因此很多时候也被称做“GC堆”(Garbage Collected Heap)。这个区域是线程共享的。
现在的收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间(这两个也被成为s1、s2空间)。
这个区域可能会出现OutOfMemoryError异常。
方法区
方法区存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。这个区域也被很多人称为永久代。这个区域也是线程共享的。
这个区域也可能会出现OutOfMemoryError异常。
运行时常量池
运行时常量池是方法区的一部分。
这个区域也可能会出现OutOfMemoryError异常。
直接内存
直接内存是指利用NIO来使用Native函数库直接分配的对外内存。
这个区域也可能会出现OutOfMemoryError异常。
浙公网安备 33010602011771号