JVM系列(3)--Java运行时数据区(Run-time data areas)

Run-time data areas
在这里插入图片描述

一.概述

  1. PC(program counter):存放指令位置

虚拟机的运行类似如下循环

while(not end) {
	取PC中的位置,找到对应位置的指令;
	执行该指令;
	PC++} 
  1. JVM stacks:每个java线程独有一个栈,里面装的是栈帧,整个方法执行过程中都会和Heap打交道,把new出来的对象放到堆里

栈帧:每个方法对应一个栈帧,栈帧的内容如下

  • 局部变量表:一个方法里的所有局部变量
  • Operand Stacks:每个局部变量都有自己的操作数栈
  • Dynamic Linking:动态链接是一个将符号引用解析为直接引用的过程。java虚拟机执行字节码时,遇到一个操作码,操作码第一次使用一个指向另一类的符号引用,则虚拟机就必须解析这个符号引用。解析时需要执行三个任务:
  1. 查找被引用的类(有必要的话就装载它,一般采用延时装载)
  2. 将符号引用(class文件常量池里的那些符号链接)替换为直接引用,这样当再次遇到相同的引用时,可以使用这个直接引用,省去再次解析的步骤在这里插入图片描述
  3. 当java虚拟机解析一个符号引用时,class文件检查器的第四趟扫描确保了这个引用是合法的
  • return address:返回值地址,若方法a调用方法b,b方法有返回值,b执行结束后就应该到a的return address上继续执行
  1. Heap详情请戳
  2. Native Method stacks:本地方法栈,即C和C++方法,Java调用的JNI,等同于Java自身的栈
  3. Direct Memory:JDK1.4之后增加的,NIO会用到,为了增加IO的效率
  4. Method area:存储class里的结构和内容

小于1.8的时候FGC是不会清理的,大于1.8会自动清理,实现如下

  • Perm Space(<1.8):字符串常量位于Perm Space,FGC不会清理,大小启动时指定,不变
  • Meta Space(>=1.8):字符串常量位于Heap,FGC会清理,若不设定,最大是物理内存

在这里插入图片描述

二.JVM常用指令(TODO)

1. invoke指令
  1. InvokeStatic:调用静态方法
  2. InvokeVirtual:自带多态,new一个对象调用其普通成员方法时,会将该对象压入操作数栈,调用的就是该对象的方法
  3. InvokeInterface:使用interface调用方法时用到
  4. InvokeSpecial:private方法不用多态,调用时就用的invokeSpecial
  5. InvokeDynamic:动态语言(eg:lamda表达式在运行时产生的类)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值