Java运行时数据区

运行时数据区域

java虚拟机在执行java程序时会把所管理的内存分配为几个不同的数据区域,这些数据区域都有各自的用途。有些是在程序编译时执行,有些时在程序执行时存在。
在这里插入图片描述

程序计数器

它可以被看作为当前线程所执行的字节码的行号指示器(正在执行的字节码指令的地址)
java代码编译后的字节码通过“字节码解释器”翻译成固定的指令操作(分支,循环,跳转,线程恢复等),程序计数器的作用就是当多线程时,一个线程因执行时间片耗尽而被挂起,而另一个线程获得时间片开始执行,当被挂起的线程恢复时想从被挂起的地继续执行,就得知道他上次被挂起的时在那个地方,程序计数器通过记录当前线程字节码执行的位置,然后按指令继续执行。所以每个线程都有一个属于自己程序计数器。

Java虚拟机栈

首先Java虚拟机栈也是跟程序计数器一样是线程私有的,他的生命周期与线程相同。
虚拟机栈描述的是java方法从调用到执行完成过程的内存模型。
在程序执行的同时会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等。

  1. 局部变量表
    局部变量表是用于存储方法参数及方法中的局部变量,其中的这些变量值是在编译期间就可知的各种基本数据类型(byte、short、int、float、char、boolean、对象引用(reference))所以这个变量表的大小是完全可以确定的。
  2. 操作数栈
    通过字节码翻译的指令来让操作数栈把一些数据进行出栈入栈的操作。
    比如执行数学运算相加,首先可以把局部变量表里的要相加的两个数据放入操作数栈的栈顶,然后再取出靠近栈顶的两个数据相加,最后把相加的结果入栈。
  3. 动态链接
    动态链接的作用就是将符号引用所表示的类、方法或者变量转换为实际的直接引用。
    在方法中调用其它的方法类或类的成员变量时这些被调用者是以一个符号引用的形式存在,因为加载验证时期还没有给所引用的类方法或变量分配地址内存,它并没有指向实际数据的地址所以这时候用符号引用代替,在编译的解析时期会把符号引用转换为直接引用。直接引用就是指向数据的内存地址。
  4. 方法出口
    调用方法执行完后会有相应的返回上一层的返回的字节码指令,这种方式是正常完成出口,或是遇到异常代码中使用了throw字节码这种方式的异常完成出口。
    方法退出过程等同于把当前栈帧出栈,可能执行的操作有:恢复上一层局部变量表和操作数栈,把返回值压入调用者的栈帧的操作数栈中,调整pc计数器为调用指令后的一条指令。

每一个方法从调用直至执行完的过程就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

  1. 补充:本地方法栈
    本地方法栈与虚拟机栈发挥的作用是相似的,区别是它为虚拟机使用到的native方法服务。简单说就是实现非Java语言所实现的方法,对一些底层的如操作系统或某些硬件交换信息时,我们使用java来编程实现起来不容易,再者使用java来编程效率也很低下。这就不得不需要调用本地方法来解决这一问题。

Java堆

java堆是Java虚拟机所管理的内存中最大的一块,他的作用就是为实例化对象分配内存,他是所有线程所共享的一块区域,也是垃圾回收器主要管理的区域。Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续即可,就像我们的磁盘空间一样。

方法区

方法区与堆一样,是各个线程所共享的区域,他的作用是在加载期间存储类信息,常量,静态变量,即时编译器编译后的代码等数据。它被描述为堆的一个逻辑部分,很多人愿意把它称作“永久带”。

运行时常量池

在这里插入图片描述
运行时常量池是方法区的一部分,在类加载时把class文件中描述的字面量(常量,字符串,具体的值),符号引用(还未分配内存地址的被调用的类,方法等) 存放入运行时常量池。在解析期间也会把解析成的直接引用存储在运行时常量池中,在运行期间也可能将新的常量放入常量池中,如String的intern()方法。

直接内存

直接内存并不属于Java虚拟机运行时内存的一部分,但这部分的内存被经常的使用,也是一种内存,堆外内存,是通过堆中的一个DirectByteBuffer对象使用Native函数库对I/O通道缓冲区的引用进行操作,这样避免了在Java堆和Native堆中来回复制数据,能在一些场景中显著提高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值