一 内存区域划分概述
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 线程私有情况
这块内存区域是线程共享的。