java字节码指令
java字节码指令
概要
众所周知,Java 字节码是跨平台的,因此 Java 才能一次编译,处处运行。关于JVM和字节码的认识分成2个部分:
1. JVM(Java Virtual Machine,Java虚拟机)是Java程序运行的虚拟计算机。它是Java平台的一部分,负责解释和执行Java字节码,并提供一种跨平台的运行环境,使得Java程序可以在不同的操作系统上运行,实现“一次编译,处处运行”的特性。
2. 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。
一、为什么要学习字节码
对学习技术来说,如果基础不扎实,就很难从专业底层的角度思考问题的本质。同样,如果不学习字节码,就很难从字节码层面去分析和理解问题。
通过对字节码的学习可以帮助我们可以更好地理解 Java中各种语法和语法糖背后的原理,更好地理解多态等语言特性。
下面结合一些例子分别说明各个指令的作用
二、示例
1. 字符串对象的创建
String s1 = new String("abc");

1) new
堆中创建对象,此时未被初始化
2)dup
复制栈顶的数值并将其压入栈顶两次
3)ldc
用于判断字符串常量池中是否保存了对应的字符串对象的引用,如果保存了的话直接返回,如果没有保存的话,会在堆中创建对应的字符串对象并将该字符串对象的引用保存到字符串常量池中。
4)invokespecial
调用构造方法对之前创建的对象赋值
5)astrore
将栈顶引用类型数值保存到局部变量表中的第1个槽位
6)return
返回方法并将返回值传递给调用者
参考链接:
https://cloud.tencent.com/developer/article/1870150
https://cloud.tencent.com/developer/article/1333540