这里又很好奇 jdk和jvm具体关系:
JDK (Java Development Kit):
JDK是Java开发工具包,它为Java开发人员提供的一个完整的开发环境。JDK包含了Java开发所需的全套工具和API(应用程序接口),主要组成部分包括:
1. JRE (Java Runtime Environment):Java运行环境,包含了JVM(Java Virtual Machine)以及其他运行Java应用程序所必需的类库和支持文件。
2. Java编译器 (javac):用于将.java源代码编译为.class字节码文件。
3. Java文档生成工具 (javadoc):用于生成API文档。
4. Java打包工具 (jar):用于将多个类文件和其他资源打包为.jar文件。
5. Java调试器 (jdb):用于调试Java应用程序。
6. 以及其他工具和实用程序**,如Java Native Interface (JNI) 工具、Java HotSpot虚拟机等。
JVM是Java虚拟机,它是Java平台的一个核心组成部分,负责执行编译后的Java字节码文件(.class文件)。JVM提供了运行Java应用程序所需的各种服务,包括内存管理、类加载、字节码验证、解释和执行等。JVM的存在实现了“一次编写,到处运行”的理念,允许Java程序在任何安装了JVM的设备上运行,而无需关心底层的操作系统或硬件架构。
刚刚以上都只是第一个功能负责解释成机器码,还有两个比较重要的功能 特别是即时编译。可以将解释好的机器码放进内存 下次用时无需解释编译 提高性能。
类加载器负责加载字节码文件,而数据区域负责管理存放字节码文件中类 接口 和对象 属于内存区。然后通过执行引擎执行字节码文件代码 进行编译和解释 而本地接口是用cpp编写的本地方法,可以拿来调用。
随后我们依次了解JVM的各个组件 从字节码文件开始。
下载查看字节码的软件----jclasslib
Releases · ingokegel/jclasslib (github.com)
1.基本信息比较简单 首先是魔数
而后主版本号-44就是java版本号 如52-44=8
注:不能用一个小的jdk或jre的版本运行高版本的字节码文件
2.常量池和方法
常量池:避免相同的内容重复定义。
字段名(变量名字)和被赋予的值(字面量)都是存放在常量池里,变量名字和字面量相同时,变量里存的地址直接指向存放的字面量。不同时,先指向string常量,这个常量指向字面量。
这里string字符串字面量不直接存放值,主要还是因为节省内存,假如这字面量很大,而且又有多个引用,则需要创建多个String,就会很拥挤
3.方法
局部变量表中 0索引存放的是main方法中的参数args 而1和2索引存放的变量是根据声明顺序决定的。
iconst_0是将常量0放入操作数栈中
istore指令是将数据从操作数栈中弹出来 放入局部变量表中 具体位置是后面跟着的下标 如istore_1
iload指令是将变量表中数据复制一份放入操作数栈中进行运算或比较什么的
jclasslib其实不便于我们在真实服务中去使用 会比较繁琐 我们会用javap命令在服务器上收集jar包中字节码相关的内容
当然还有更好用的: