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