虚拟机初篇01

本文详细介绍了JavaDevelopmentKit(JDK)的组成,尤其是JRE和JVM的作用,以及它们在编译、运行和优化Java程序中的关键角色,包括类加载、字节码处理和性能提升机制。同时提到了类加载器、常量池和本地接口等概念,并推荐了jclasslib和javap工具的使用场景。
摘要由CSDN通过智能技术生成

这里又很好奇 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包中字节码相关的内容

当然还有更好用的:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值