Java运行时的内存区域

一 内存区域划分概述

java运行时内存区域.png

Java运行时的内存主要包括:方法区,堆,栈(虚拟机栈,本地方法栈),程序计数器。
其中栈(虚拟机栈,本地方法栈)和程序计数器是线程私有的,方法区和堆是线程共享的。

二 程序计数器

2.1 含义

一块较小的内存空间,当前线程所执行的字节码行号的指示器;字节码解释器工作时,通过改变计数器的值 选取下一条执行的字节码指令;(一些基本功能都需要依赖计数器来完成如:分支、循环、跳转、异常处理、线程恢复等)
当线程正执行 Java 程序时:程序计数器 记录正在执行的虚拟机字节指令地址。
执行 native 方法,计数器值为空 undefined;】

2.2 内存异常情况

没有规定任何 OutOfMemoryError 情况的内存区域;

2.3 线程私有情况

是线程私有的。

三 栈(虚拟机栈,本地方法栈)

3.1 含义

由一个一个的栈帧组成,栈帧是在每一个方法调用时产生的,是方法的工作空间。每一个栈帧由局部变量区、操作数栈等组成。每创建一个栈帧压栈,当一个方法执行完毕之后则出栈。

3.2 内存异常情况

栈帧过多,会抛出 StackOverflowError。
初始化新的虚拟机栈时申请不到足够的内存,则会抛出 OutOfMemoryError。

3.3 线程私有情况

是线程私有的。

四 堆

4.1 含义

Java 堆是整个虚拟机所管理的最大内存区域,所有的对象创建都是在这个区域进行内存分配,GC回收也是主要针对这块内存区域。

4.2 内存异常情况

创建新对象申请不到足够的内存,则会抛出 OutOfMemoryError。

4.3 线程私有情况

这块内存区域是线程共享的。

五 方法区

5.1 含义

方法区主要用于存放已经被虚拟机加载的类信息,如常量,静态变量。

5.2 内存异常情况

超出内存大小会抛出 OutOfMemoryError。

5.3 线程私有情况

这块内存区域是线程共享的。

推荐阅读更多精彩内容