一、什么是JVM
JVM全称Java Virtual Machine,中文译名Java虚拟机。
Jvm本质是一个运行在计算机上的程序,它的职责是运行java字节码文件。
二、JVM功能
1、解释和运行
对字节码文件中的指令,实时的解释成机器码,让计算机去执行
2、内存管理
自动为对象,方法分配内存,
自动的垃圾回收机制,回收不再使用的对象
3、即时编译
对热点代码进行优化,提升执行效率
三、常见JVM虚拟机有哪些
HotSpot,GraalVM,OpenJ9
四、JVM组成
1、类加载器(ClassLoader)
加载class字节码文件中的内容到内存中
2、运行时数据区(JVM管理的内存)
负责管理JVM使用到的内存,比如创建对象,销毁对象
3、执行引擎(即使编译器,解释器,垃圾回收器等)
将字节码文件中的指令解释成机器码,同时使用即使编译器优化性能
4、本地接口
调用本地已经编译的方法,比如虚拟机中的提供的C/C++的方法
五、字节码文件的组成
基本信息
1、以正确姿势打开文件
字节码文件保存了源码编译之后的内容,以二进制的方式存储,无法直接用记事本直接打开阅读。
这里推荐使用jclasslib工具查看字节码文件
2、字节码文件组成
- 基础信息:魔数,字节码文件对应的java版本号,访问标识(public,final),父类和接口
- 常量池:保存了字符串常量,类,或接口名,字段名主要在字节码指令中使用
- 字段:当前类或接口声明的字段信息
- 方法:当前类或接口声明的方法信息字节码指令
- 属性:类的属性,比如源码的文件名内部的列表等
3、Magic-魔数
- 文件是无法通过扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件内容。
- 软件使用文件的头几个字节(文件头)去校验文件的类型,如果不支持该种类型就会出错。
- java字节码文件中,将文件头称为magic魔数
4、主副版本号
- 主副版本号指的是编译字节码文件的JDK版本号,主板版号用来表示大版本号,副版本号是当主版本号相同时区分不同版本的标识,一般只关心主版本号。
- 版本号的作用就是判断当前字节码的版本和运行时的JDK是否兼容
常量池
字节码文件中常量池作用:避免相同的内容重复定义,节省空间。
方法
字节码中的方法区域是存放字节码指令的核心位置,字节码指令的内容是存放在方法的Code属性中。
常用工具
1.javap -v 命令
- javap是JDK自带的反编译工具,可以通过控制台查看字节码文件内容。适合在服务器上查看字节码内容。
- 直接输入javap查看所有参数
- javap -v 字节码文件名称 查看具体字节码信息。(如果jar包需要用jar -xvf 命令解压)
- 将字节码存入到文件中
javap -v Demo1.class > Demo.txt
2.ideal插件jclasslib
3.阿里arthas
下载地址:Releases · alibaba/arthas · GitHub
功能:
- 监控面板
- 查看字节码信息
- 方法监控
- 类的热部署
- 内存监控
- 垃圾回收监控
- 应用热点定位
常用命令
1.启动
java -jar arthas-boot.jar
2.查看控制面板
dashboard -i 3000 -n 2
3.将字节码保存到指定目录
dump -d D:/jvm/data/ edu.hut.whx.arthas.Demo
4.查看运行类的源代码
jad edu.hut.whx.arthas.Demo
六、类的声明周期加载阶段
1、加载阶段
1.加载阶段的第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。
程序员可以使用Java代码拓展的不同渠道
2.类加载器在加载完之后,Java虚拟机会将字节码中的信息保存到方法区中
3.类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存方法区中。
生成一个InstanceKlass对象,保存所有类信息,里面还包含实现特定功能比如多态信息。
4.同时,java虚拟机还会在堆中生成一份与方法中数据类似的java.lang.Class对象。作用是在java代码中获取类的信息以及存储静态字段的数据(JDK1.8及以后)。
2.连接