1.概述
java源文件通过编译为java字节码文件,然后通过类加载器加载文件中各个类字节码,然后通过jvm执行。在这个过程中需要一个空间用于存储程序执行期间需要的数据和信息。这个空间叫做运行时数据区。
2.运行时数据区的划分
通常会划分为:程序计数器 ,java栈(虚拟机栈),本地方法栈,堆,方法区。
这五个部分也可以分为 线程私有 和 线程共享 。
3.程序计数器
作用:用于指示当前线程所执行的字节码指令地址。
特点:a.线程私有 (为了在线程间切换执行工作时,保持线程数据的完整性)
b.如果线程执行的是非native方法,则程序计数器保存的是当前需要执行的指令的地址,如果是native方法,程序计数器的值就是undefined
c.程序计数器是不会出现oom异常的,因为程序计数器的大小不会随着程序变化。
4.java栈(虚拟机栈)
java栈是java方法运行的内存模型。java栈存放的是栈帧,一个栈帧对应的是一个java方法。
图上所示栈帧的结构是 局部变量表 ,操作数栈,只想运行时常量池的引用,方法返回地址,附加信息。
局部变量表:用于存储方法中局部变量(java方法中声明的非静态变量和形参)。基本数据类型的变量存储值,引用类型存储对象的引用。
操作数栈:用于程序中计算的过程。
指向运行时常量池的引用: 在方法运行过程中,难免会遇到使用到类中的常量,所以需要一个指向运行时常量的引用。
方法返回地址:执行完一个方法后,要返回之前调用它的地方。
附加信息:方法的附加信息。
特点:线程私有
5.本地方法栈
与java栈类似,区别在于本地方法栈为native方法提供服务,而java栈为java方法提供服务。
特点:线程私有
6.堆
java中堆是用于存储对象本身以及数组。java垃圾收集器主要的管理地方就是堆。
特点:线程共享的
7.方法区
在方法区中,存储了每个类的信息(包括类的名称,方法信息,字段信息),静态变量,常量以及编译器编译后的代码等。
特点:线程共享的。
学习的博客
网友评论