java虚拟机在运行java时会管理着一块内存区域:运行时数据区
在运行时数据区里根据用途进行划分:
1.java虚拟机栈(栈区)
2.本地方法区
3.java堆(堆区)
4.方法区
5.程序计数器
内存模型分区:
一、java堆(堆区)
定义:即堆内存(heap);是垃圾收集管理器的主要区域,因此也叫:GC堆
作用:存放java对象实例
特点:java内存中最大;线程共享
抛出的异常:oom,即堆中没有足够的内存完成对象实例的分配&堆无法再扩展
备注:a.从内存回收的角度 分为:新生代&老年代
b.从内存分配角度:相当于多个线程私有的分配缓冲区
二、java虚拟机
定义:即栈内存(stack);是stack、java方法执行的内存模型
作用:储存java方法执行时的局部变量;
注:1.以帧栈的形式;
2.含数据类型、对象的引用
3.方法执行结束后则释放
特点:线程私有;声明周期与线程相同
抛出的异常:oom 虚拟机栈扩展时无法申请到内存空间;StackOverflowError 线程请求深度》虚拟机所允许深度
注:1.每个java方法执行时都会创建一个栈帧;
2.一个java方法从被调用到执行完成=一个栈帧在虚拟机栈中的入栈到出栈
3.局部变量表所需内存空间在方法编译时就完成分配,在方法运行时不会改变大小
三、本地方法栈
简介:十分类似java虚拟机栈,与java虚拟机栈区别在于:服务对象,即java虚拟机栈为执行java方法服务;本地方法栈为执行Native方法服务
四、方法区
定义:堆的一个逻辑部分;为了与java堆分区,又称“非堆”区域(Non-Heap)
作用:储存已被虚拟机加载的类信息、常量、静态变量等数据
特点:线程共享
抛出的异常:oom 当方法区无法满足内存分配需求
注:该区域的内存回收主要是针对运行时常量池和对类的卸载,又称永久代:回收条件苛刻,很少出现垃圾收集
其内部包含一个运行时常量池,具体介绍如下:
定义:方法区的一部分
作用:存放类文件在编译时生成的各种字面量&符号引用
特点:动态性;即 运行时也可添加新的常量,如:String类的intern()
抛出的异常:oom,即当常量池无法申请到内存时
五、程序计数器
定义:当前线程所执行的字节码的行号指示器
作用:实现异常处理、线程恢复等基础功能
原理:通过改变计数器的值来选取下一条执行的字节码指令
特点:线程私有;内存空间小
抛出的异常:唯一一个在jvm中无任何oom的内存区域
注:私有线程的内存区域:为了使得线程切换后恢复到正确的执行位置,每条线程都配有一个独立的程序计数器,各线程互不影响,独立储存的内存区域