自动内存管理机制(一) Java内存区域
虚拟机
虚拟机是计算机系统的模拟,基于计算机架构,提供物理计算机的功能
Java虚拟机
将Java或者其他语言编写的程序编译为Java字节码,并能让程序在计算机上运行的虚拟机
运行时数据区域
1) 程序计数器
当前线程所执行的字节码的行号指示器
特征:
> 字节码解释器根据程序计数器确定下一条需要执行的字节码指令
> 线程执行Java方法,计数器记录虚拟机字节码指令的地址
> 线程执行Native方法,计数器为空(Undefined)
> JVM中唯一没有规定OutOfMemoryError的区域
2) Java虚拟机栈
描述Java方法执行的线程模型,方法执行时都会创建一个栈帧
特征:
> 栈帧用来存储局部变量表,操作数栈,动态链接,方法出口等信息,方法执行过程,对应着一个栈帧在虚拟机栈中入栈到出栈的过程
> 局部变量表所需空间在编译期间完成分配,进入方法时,方法需要在帧中分配多少局部变量空间是完全确定的,运行期间不会改变局部变量表的大小
局部变量表:
> 基本数据类型,1个局部变量空间,除了long和double2个局部变量空间
> 对象引用,并非对象本身,1个局部变量空间
> returnAddress类型:字节码指令的地址,1个局部变量空间
异常:
> *Error:线程请求栈深度大于虚拟机允许的深度
> OutOfMemoryError:虚拟机栈动态扩展是无法申请到足够的内存
3) 本地方法栈
本地方法栈为虚拟机使用的Native方法服务
异常:
> *Error
> OutOfMemoryError
4) Java堆
虚拟机启动时创建所有线程共享的内存区域
特征:
> 存放对象实例
> 垃圾收集器管理的主要区域(有时称为GC堆)
> Java堆可以处于物理上不连续的内存空间中,逻辑上是连续的
异常:
> OutOfMemoryError
5) 方法区
存储被虚拟机加载的类信息,常量,静态变量,JIT编译器编译后的代码等
特征:
> 内存回收目标是针对常量池的回收和类型的卸载
>运行时常量池:
> Class文件在编译期生成的各种字面量和符号引用的文件常量池,加载入方法区,形成运行时常量池
> 动态性:并非一定是要Class文件常量池加载到方法区,在运行期间也可能有新的常量放入池中,如String的intern()
异常:
> OutOfMemoryError
直接内存
不是虚拟机运行时数据区的一部分,但经常被使用,NIO使用Native函数库直接分配堆外内存,通过Java堆中的DirectByteBuffer对象引用直接内存进行操作,显著提高性能,避免Java堆和Native堆中复制数据
异常:
> OutOfMemoryError