Java内存区域

来源:互联网 发布:南京seo公司优化 编辑:程序博客网 时间:2024/06/17 12:06

Java虚拟机在执行Java程序时,将它管理的内存划分为几个不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间;


Java虚拟机所管理的内存一般包括以下几个区域:

1. 程序计数器

一块较小的内存空间,是当前线程的行号指示器(字节码解释器工作时通过改变这个计数器的值来选择下一条需要执行的字节码指令),每条线程都需要有一个独立的程序计数器;此内存区域没有规定OutOfMemoryError;

2. Java虚拟机栈

同样是线程私有的,用于存放Java方法执行的内存模型,每个方法在执行的同时会创建一个栈帧,用于存储局部变量表、操作数栈等信息,每一个方法从调用到执行完成的过程,对应着一个栈帧在虚拟机栈中从入栈到出栈的过程;

我们所指的栈一般指虚拟机栈中的局部变量表部分,局部变量表中存放了编译期可知的各种基本数据类型、对象引用等类型;

若线程请求的栈深度大于虚拟机所允许的最大深度,抛出StackOverFlowError;

若扩展栈时无法申请到足够的空间,抛出OutOfMemoryError;

为每个线程的栈分配更大的栈空间,线程栈就可以越深,可以建立的线程数就会越少;

3. 本地方法栈

与虚拟机栈类似,为虚拟机使用到的native方法提供服务,有的虚拟机将本地方法栈和虚拟机栈合二为一;

4. Java堆

Java堆是Java虚拟机管理内存中最大的一块,Java堆是被所有线程共享的一块区域,该区域的唯一作用就是存放对象实例,同时也是垃圾收集器管理的主要区域;

可能出现OutOfMemoryError,堆中可能出现内存泄漏(程序申请内存后,无法释放已申请的内存空间,内存泄漏堆积的后果是消耗完虚拟机所有的内存)

5. 方法区

方法区同Java堆一样,是被所有线程所共享的一块区域,用于存储被虚拟机加载的类信息、常量、静态变量、编译后的代码等数据;永久代和方法区并不等价,只是方法区用永久代实现,因为垃圾收集行为很少在这块区域出现;

6. 运行时常量池

是方法区的一部分,相对于class文件的常量池,具备动态性;

7. 直接内存

Java NIO中使用到;


参考文献:深入理解Java虚拟机-第二版

0 0
原创粉丝点击