JVM学习之运行时数据区域

1.关于JVM的学习,自学的话推荐深入理解java虚拟机这本书

2.java内存运行时数据区域有哪些

Java虚拟机在执行java程序的过程中会把他所管理的内存划分若干个的不同的数据区域,这些区域有各自的用途以及创建销毁时间,有的区域随着java虚拟机的启动而存在,有的则依赖用户线程的启动和结束而建立和销毁。

看图:

程序计数器:是较小的内存空间,看作当前线程执行的字节码的行号指示器,代码的执行,处理,线程恢复等功能需要依赖这个完成。,并且,为了线程切换后恢复到正确的位置,每条线程都需要有独立的程序计数器,我们称为线程私有的内存 

注意:如果线程正在执行Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的的地址,如果在执行native方法,则这个计数器值为空,undefined。此时内存区域是唯一一个在java虚拟机规范中没有规定outofMemoryError情况的区域。

java虚拟机栈:也是线程私有的,生命周期与线程相同,描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧 用于存储局部变量表,操作数栈等信息,每个方法从调用直到完成的过程,对应着一个栈帧在虚拟机栈出栈入栈的过程。

注意:如果线程请求栈深度大于虚拟机栈允许的深度,将抛出stackOverFlowError异常;如果虚拟机栈可以动态扩展,

如果扩展时无法申请到足够的内存就会抛出OutOfMemoryError异常

本地方法栈:与虚拟机栈作用非常相似,区别是一个是为虚拟机执行java方法,一个是为虚拟机使用到的Native方法服务,同样会抛出stackOverFlowError,OutOfMemoryError异常

java堆:是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存唯一目的就是存放对象实例,几乎所有对象实例都在这里分配内存。是垃圾收集器管理的主要区域,也称GC堆。从内存分配角度看,变成共享的java堆可能划分出多个线程私有的分配缓冲区(TLAB),不过无论怎么划分,都与存放内容无关,无论哪个取消,存储的都仍然是对象实例,进一步划分的目的是为了更好的回收内存,或者更快的分配内存。

方法区:是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息,常量,静态变量,即使编译器编译都代码等数据,要与java堆区分开来。

注意:当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常

猜你喜欢

转载自blog.csdn.net/qq_33188563/article/details/81712135