Java虚拟机的运行时数据区

Java虚拟机运行时数据区

在这里插入图片描述

一、程序计数器

        程序计数器是一块较小的内存空间,它可以看作是当前线程的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常、跳转、线程切换都需要依赖这个计数器来完成。
        如果正在执行的是Java方法,那么线程计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的Native方法,那么这个计数器的值为空。

二、Java虚拟机栈

        Java虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候就会创建一个栈帧,这个栈帧包含着这个方法执行所需要的操作数栈、局部变量表、动态链接、方法出口。每个方法从调用直至执行完成的过程就是这个栈帧从虚拟机中入栈到出栈的过程。
        局部变量表中存储着编译期可知的各种基本数据类型(byte,char,short,int,float,double,long,boolean)、对象引用和returnAddress(指向了一个字节码指令的地址)。

三、本地方法栈

        本地方法栈与Java虚拟机栈发挥的作用是非常相似的,他们之间的区别只是Java虚拟机栈是为Java方法服务,而本地方法栈是为虚拟机使用到的Native方法服务的。

四、Java堆

        Java堆是大多数应用中,虚拟机所管理的内存中最大的一块。此区域存在的唯一目的就是为了存放对象实例,几乎所有的对象实例都是在这里分配内存。
        Java堆是垃圾收集器管理的主要区域,也被称为"GC"堆。

五、方法区

        方法区用于存储已被虚拟机加载的类信息、常量、静态变量、JIT即时编译器编译后的代码等数据。这区域的回收目标主要是对常量的回收和类型的卸载。

六、运行时常量池

        运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述的信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
        运行时常量池相对于Class文件常量池的一个重要特征就是具备动态性,运行时也可能将新的常量放入池中,这种特征呗利用较多的是String类的intern()方法。

七、直接内存

        直接内存并不是虚拟机运行时数据区的一部分,在JDK 1.4中新加入的NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场合显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

发布了167 篇原创文章 · 获赞 230 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_39240270/article/details/95061821