JVM主体结构和java栈的详细解读

JVM 主体结构

JVM 作用

 JVM是java虚拟机(Java Virtual Machine),其实现了“一次编译,处处运行”的功能。
 如果没有JVM,我们编写java代码时,如果想在Windows平台上运行,那就需要编写一套
 适用于Windows平台的。如果想在linux平台上运行,则编写一套linux的。

在这里插入图片描述

JVM主体结构

JVM 内存区域大致分为:
Class文件、类装载子系统、运行时数据区、执行引擎
在这里插入图片描述

线程私有和线程公有

线程公有:
在运行时数据区中,方法区和堆是属于线程公有的,也就是这两块区域是“循环利用”的,所以要对其进行垃圾回收。其是在虚拟机启动时创建。

线程私有:
虚拟机栈、本地方法栈、程序计数器是属于线程私有的,其与线程“同生死”,属于“一次性”的,所以不用对其进行垃圾回收

JVM的栈帧

定义:
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区中的虚拟机栈的栈元素。
作用:
每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程。

JVM 运行时栈帧结构

在这里插入图片描述
上面程序转换为栈帧如图所示
在这里插入图片描述
在这里插入图片描述
逐步分析:

  public static int test();
    Code:
        0: iconst_3
       1: istore_0
       2: iconst_2
       3: istore_1
       4: iload_0
       5: iload_1
       6: imul
       7: istore_2
       8: iload_2
       9: ireturn
}

0: iconst_3 相当于将 int 型3放入栈顶
在这里插入图片描述
1: istore_0
2: iconst_2
3: istore_1
将栈顶int型数值存入第一个本地变量
将int型2放入栈顶
将栈顶int型数值存入第二个本地变量
在这里插入图片描述
4: iload_0
5: iload_1
将指定的int型本地变量推送至栈顶
在这里插入图片描述
6: imul
将栈顶两int型数值相乘并将结果压入栈顶 在这里插入图片描述
7: istore_2
8: iload_2
将int 6出栈 放入局部变量表
复制局部变量表第三个元素放入栈中 在这里插入图片描述

栈帧之间传值

两个栈帧作为虚拟机栈的元素是完全独立的,但是虚拟机会做出相应的优化,令两个栈帧出现一部分重叠。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值