1.JVM在运行时的数据区:
方法区,虚拟机栈, 本地方法栈
堆 程序计数器
2.程序计数器
每个线程都需要有自己的程序计数器,所以这类内存是属于线程私有的内存
3.java虚拟机栈
也是线程私有的,生命周期与线程相同 【栈帧 是方法运行时的基础数据结构】
描述的是java方法执行的内存模型:每个方法在执行的同时,都会创建一个"栈帧",用来存储局部变量表操作数栈,动态链接,方法出口等信息。每个方法从调用到执行完成的过程,就对应这一个栈帧在虚 拟机栈中入栈到出栈的过程。在虚拟机规范中,对java虚拟机栈规定了两种异常情况:
①.如果先后才能请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。
②.在动态扩展虚拟机栈,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常
3.本地方法栈
只不过本地方法栈为虚拟机使用到的Native方法服务
而虚拟机栈是为虚拟机使用的java方法(字节码)服务
3.Java堆
Java堆是虚拟机所管理的内存中最大的一块。为线程共享,在虚拟机启动的时候创建。
唯一目的是:存放对象实例,
同时,java堆也是垃圾收集器管理的主要区域,也成为了GC堆
java堆可以处于武理上不连续的内存空间,但是要求逻辑上连续。
java堆的内存,也可设置成固定大小和可扩展,
若是在堆内存中没有完成实例分配,并且堆也没有在扩展是,会抛出OutOfMemoryError异常。
3.方法区
为线程共享,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
垃圾收集行为在这个区域较少出现,但并非进入该区域的数据就永久存在。
这个区域的回收目标主要是针对常量池的回收和对类型的卸载。但是对类型的卸载,条件相当苛刻。不过对该区域的回收确实是有必要的。
网友评论