JVM核心知识

分享JVM核心基础

JVM 核心知识

Java是什么样的编程语言

编程语言分类:

  • 面向过程,面向对象,面向函数
  • 静态类型,动态类型
  • 编译执行,解释执行
  • 有虚拟机,无虚拟机
  • 有GC,无GC

Java是一种面向对象,静态类型,编译执行,有VM/GC和运行时,跨平台的高级语言。

跨平台

C++通过源代码跨平台。在不同的OS中编译。

Java通过字节码(二进制)跨平台。编译之后生成的字节码可以在不同的OS中运行。

字节码,类加载器,虚拟机

文件系统 (字节码文件) -> 虚拟机(类加载器) -> 对象实例

Java字节码技术

字节码是由单个字节组成的指令,理论上最多支持256个。实际上Java只用了200左右的,还有一些操作码保留给调试调用。

主要分为4大类:
1 栈操作指令,包括局部变量交互的指令
2 程序流程控制指令
3 对象操作指令,包括方法调用指令
4 算术运算以及类型转换指令

生成字节码

编译: javac demo.java
查看字节码:javap -c demo

本人对字节码暂时不感兴趣。

了解什么是偏移量,字节码,助记符,程序计数器,局部变量区以及求值栈即可。

JVM类加载器

类的生命周期

1 加载:找Class文件
2 验证:验证格式,依赖
3 准备:静态字段,方法表
4 解析:符号解析为引用
5 初始化:构造器,静态变量赋值,静态代码块
6 使用
7 卸载

类加载的时机

1 虚拟机启动时,初始化主类
2 new一个类的时候要初始化该类
3 调用静态方法、静态字段的时候初始化静态所在地类
4 子类的初始化会触发父类的初始化
5 方接口定义了default方法,则该接口的实现类的初始化会触发接口的初始化
6 反射API对类反射调用的时候,会初始化该类
7 初次调用MothodHandle的时候,初始化该MethodHandle所指向方法所在的类

不会初始化(可能会加载)

1 通过子类调用父类的静态字段,只会出发父类的初始化,不会出发子类的初始化
2 定义对象数组,不会触发初始化
3 常量在编译器件会存入调用类的常量池中,本质上没有引用定义常量的类,不会触发定义常量所在的类。
4 通过类名获取Class对象,不会触发类的初始化
5 通过Class.forName加载指定类的时候,如果指定参数initialize为false的时候,不会触发类初始化。
6 通过ClassLoader默认的loadClass方法,也不会触发初始化动作(加载了,但是不初始化)

三类加载器

1 启动类加载器 BootstrapClassLoader
2 扩展类加载器 ExtClassLoader
3 应用类加载器 AppClassLoader