运行时数据区域
Java虚拟机在执行就Java程序的时候会把它所管理的内存分为多个区域,有些区域随着Java虚拟机进程启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立销毁。根据《Java虚拟机规范》,Java虚拟机管理的运行时区域如下图:
一.程序计数器
- 线程私有内存
- 是当前线程所执行的字节码的行号指示器
- 执行Java方法,计数器记录的是正在执行虚拟机字节码指令地址
- 执行本地方法,计数器的值则为空(Undefined)
- 唯一一个没有规定任何OOM的区域
二.虚拟机栈
- 线程私有
- 随着线程的启动而创建,线程的销毁而销毁
- 每个方法执行的时候都会创建一个自己的栈帧;栈帧中存放的是** 局部变量表、操作数栈、动态链接、方发出口等信息 。**
- 局部变量表:存放了在编译期可知的Java虚拟机的基本数据类型(byte、boolean、char、short、int、long、float、double),对象引用以及returnAddress类型;
三.本地方方法栈
与虚拟机栈作用相似,不同在与虚拟机栈是执行Java方法,本地方法栈执行的是本地方法(HotSpot虚拟机是将虚拟机栈与本地方法栈合二为一 )。
四. Java堆
- 是虚拟机管理的中内存最大的一块;
- 所有线程共享,虚拟机启动的时候创建;
- 存放对象实例及数组
- 是垃圾收集器管理的一个内存区域
- 分为新生代以及老年代
新生代: 包含Eden区、From Survivor、To Survivor区
- Java堆可以按照需求来扩展大小
可以通过-Xmx :最大堆内存;及-Xms :最小堆内存来设置堆大小
- 不连续的内存空间
五. 方法区 也叫Meta-space
- 多线程共享
- 用于存储已被虚拟机加载的类型信息、常量、静态变量、及时编译器编译后的代码缓存等数据
- 一般不会被垃圾回收,垃圾回收器在这个区域主要是针对常量池的回收和对类型的卸载。