运行时数据区域
java虚拟机所管理的内存将会分为以下几个区域,如图:
程序计数器
1.可以看成当前线程所执行的字节码的行号指示器。
2.每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存
java虚拟机栈
1.线程私有的
2.生命周期同线程一样
3.java虚拟机栈描述的是Java方法执行的内存模型(为java方法服务)
4.java程序员主要关注的 则是 栈中的局部变量表部分
局部变量表--存放编译期可知的各种数据类型, 对象引用 和 return Address(指向一条字节码指令的地址)
局部变量表 所需的内存空间在编译期间完成分配,在方法运行期间不会改变大小
本地方法栈
1. 与java虚拟机栈发挥的作用非常相似
2. 区别: 本地方法栈为虚拟机使用到的Native方法服务
java堆
1. 唯一的目的是存放对象
2.是所有线程共享的一块区域
3.在虚拟机启动时创建
方法区
1.线程共享的区域
2.用于存储已被虚拟机加载的 类信息,常量,静态变量,即时编译编译后的代码等数据
3.当方法区无法满足内存分配需求时,会抛出 OutOfMemoryerror 异常
运行时常量池
1.运行时常量池是方法区的一部分
2.用于存放编译期生成的各种字面量和符号引用
3.运行时常量池 相对于 class 常量池的 另一个特点是 具备动态性,运行期间也可能将新的常量放入池中
4.当常量池无法再申请到内存时,会抛出OutOfMemeryError 异常
直接内存
1.本机直接内存的分配不受java堆大小的限制 , 收到本机总内存大小以及处理器寻址空间的限制
2.当各个内存区域总和大于物理内存限制,会导致动态扩展中出现 OutOfMemoryError 异常