jvm-运行时区域

运行时区域

程序计数器

​ 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器来完成。显然,每个线程都需要一个独立的程序计数器。

Java虚拟机栈

​ 与程序计数器一样,虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时,会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出站的过程。

​ 其中局部变量表存放的是编译期可知的基本类型(boolean、byte、char、shor、int、float、long、double)、对象引用(不等同于对象本身,只是一个符号引用,会在解析阶段转换成对象的直接引用)。

本地方法栈

​ 与虚拟机栈类似,不同的是它为虚拟机使用到Native方法服务。

Java堆

​ 一般的应用中,java堆是虚拟机管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域:几乎所有的对象实例和数组都在这里分配内存。

​ Java堆是垃圾收集管理器的主要区域,由于现在手机器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点可以分为:Eden空间、From Survivor空间、To Survivor空间等。从内存分配角度来看,线程共享的堆可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。不过无论如何划分,无论哪个区域,存储的都是对象的实例,进一步划分的目的是为了更好的回收内存,或者更快地分配内存。

​ 这部分内存空间只要逻辑上的连续即可,不要求物理上不连续的控件。如果在堆中没有内存完成实例的分配,并且堆也无法扩展时,将会排重OutOfMemoryErro异常。

方法区

​ 方法区(Mehod Area)与Java堆一样,是各个线程共享的内存区域,它用于存储虚拟机加载的类信息、常量、静态变量等。从jdk1.7开始,jvm已经把原本存放在方法区中的字符串常量池移出道堆中,并且在jdk8中去除了永久代,用元空间来代替。

运行时常量池

​ 运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用(包括类加载阶段解析后的直接引用),这部分内容将在类加载后进入方法区时的运行时常量池存放。

​ 相对于Class文件的常量池,运行时常量池还具有动态性比如String.inter()。

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章