Java内存区域总结

2018-03-31  本文已影响0人  南山一棵树丶

JVM运行时的数据区域如下图所示:


JVM运行时数据区

程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字码节行号指示器。通过改变计数器的值来选取下一条需要执行的字码节指令。

每个线程都需要一个独立的程序计数器,因此该内存为线程私有。此内存区域是唯一一个在JVM规范中没有规定OutOfMemoryError的情况。

Java虚拟机栈

通常我们把Java内存区域分为“堆(Heap)”和“栈(Stack)”。这里所说的“栈”就是Java虚拟机栈。
每个方法在执行时都会创建一个栈帧,用来存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用到执行完成,对应着一个栈帧在虚拟机栈中入栈和出栈的过程。

Java虚拟机栈的两种异常情况:
1. 请求的栈深大于虚拟机栈所允许的深度,会出现StackOverflowError异常。
2. 如果虚拟机动态扩展无法申请到足够的内存,就会抛出OutOfMemoryError异常。

本地方法栈

本地方法栈类似于Java虚拟机栈,他们的区别在于:Java虚拟机栈为虚拟机执行Java方法服务,本地方法栈为虚拟机使用到的Native方法服务。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemory异常。

Java堆

Java堆内存的唯一目的就是存放对象实例
Java虚拟机规范的描述是:所有的对象实例以及数组都要在堆上分配。
Java堆是被所有内存共享的一块区域。
如果在堆中没有内存完成对象实例分配,并且堆无法再扩展,会抛出OutOFMemoryError异常。

方法区

方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。当方法区无法满足内存分配需求时,会抛出OutOfMemoryError异常。

运行时常量池

运行时常量池是方法区的一部分。
Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项重要信息是运行时常量池,用于存放编译期生成的字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
运行时常量池作为方法区的一部分,当常量池无法申请内存时,会抛出OutOfMemoryError异常。

上一篇下一篇

猜你喜欢

热点阅读