赞
踩
我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。
不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。
Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式——Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码,Bytecodes)和符号表,还有一些其他辅助信息。
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源。
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
具体来说:这两种架构之间的区别:
1)基于栈式架构的特点:
2)基于寄存器架构的特点
我们用代码来举例,如下代码:
package com.drhj;
/**
* Author: DRHJ
* Date: 2022/10/16 19:07
*/
public class StackStruTest {
public static void main(String[] args) {
int i = 2;
int j = 3;
int k = i + j;
}
}
我们进行运行
会得到Class文件
我们进行反编译
得到main方法的字节码
iconst_2 : 定义常量2
istore_1 :保存到局部变量表索引为1的位置
iload_1 : 加载索引为1位置的操作
iadd :进行相加操作
总结:
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限与嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?
Java虚拟机的启动是通过引导类加载器(bootstrap,class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机具体实现指定的。
package com.drhj; /** * Author: DRHJ * Date: 2022/10/16 19:07 */ public class StackStruTest { public static void main(String[] args) { int i = 2; int j = 3; int k = i + j; try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("hello"); } }
我们上述代码,在打印出hello前,在终端输入jps,如下
睡眠6s的目的就是为了能够及时看到进程,此时程序在执行“StackStruTest”的进程;
当打印出hello后,程序结束,进程结束
有如下的几种情况:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。