JVM
1、初始 JVM
简单描述一下 JVM :JVM 本质是一个运行在计算机上的程序,它的职责是运行字节码文件。
JVM 的三大功能:
- 解释和运行:对字节码文件中的指令,实时的解释成机器码,让计算机执行
- 内存管理:自动为对象、方法等分配内存;自动回收不再使用的对象
- 即时编译:对热点代码优化,提升执行的效率
JVM 的组成:
- 类加载器:加载 class 字节码文件到内存中
- 运行时数据区域(JVM 管理的内存):负责管理 JVM 使用到的内存,也就是 Java 的运行时数据区域
- 执行引擎(即时编译器、垃圾回收器、解释器等):将字节码文件中的指令解释成机器码,同时使用即时编译器提高性能
2、认识字节码文件的组成
- 一般信息:魔术、字节码文件对应的 Java 版本号、访问标识、父类和接口
- 常量池:字符串常量池、类和接口名、
- 字段:当前类或接口声明的字段信息
- 方法:当前类或接口声明的方法信息
- 属性:类的属性,比如源码的文件名,内部类的列表等
如何查看字节码文件:
1、本地文件可以使用jclasslib工具查看,开发环境使用jclasslib插件。
2、服务器上文件使用javap命令直接查看,也可以通过arthas的dump命令导 出字节码文件再查看本地文件。还可以使用jad命令反编译出源代码。、
3、类的生命周期
类的生命周期:加载、连接(包含验证、准备、解析)、初始化、使用、销毁
加载
类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息,不同的渠道包括本地字节码文件、网络传输的类、动态代理生成的类
类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。
类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中。 生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。
同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象。
对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中所有信息。 这样Java虚拟机就能很好地控制开发者访问数据的范围。
连接
验证:验证内容是否满足《Java虚拟 机规范》
准备:给静态变量赋零值,final 修饰的静态变量赋初值
解析:将常量池中的符号引用替换成指向内 存的直接引用
初始化
初始化阶段会执行静态代码块中的代码,并为静态变量赋值。
初始化阶段会执行字节码文件中clinit部分的字节码指令。
4、类加载器
自顶向下分别是:
C++ 实现的启动类加载器 Bootstrap
Java 实现的扩展类加载器 Extension
Java 实现的应用程序类加载器 Application
Java 中如何使用代码主动去加载一个类?:
使用 Class.forName() 方法,使用当前类的类加载器去加载一个类
获取类加载器,通过类加载器的 loadClass 方法指定某个类加载器加载:
双亲委派机制:
如何打破?:
5、Java 内存区域
参考这篇文章:https://blog.csdn.net/m0_64201189/article/details/136435783?spm=1001.2014.3001.5501
主页:https://blog.csdn.net/m0_64201189
5、垃圾回收
参考文章:https://blog.csdn.net/m0_64201189/article/details/136416748?spm=1001.2014.3001.5501
补充一下 G1 回收器:
tps://blog.csdn.net/m0_64201189/article/details/136416748?spm=1001.2014.3001.5501
补充一下 G1 回收器: