- 使用javac命令编译.java源代码文件生成.class字节码文件
- 使用javap -c -v XXX.class可以查看字节码文件内容
- ClassLoader
- 将class字节码文件加载到JVM虚拟机中
- 搜索class字节码文件的范围是由classpath中配置的一个或多个路径来决定的,如果执行时真的找不到则会抛出ClassNotFound异常。
- 文件验证器检查每一个class字节码文件的过程
- 字节码文件结构
- 检查class字节码文件开头的几个数字,即魔数,一般就是0xCAFEBABE,说明是一个Java类。
- 检查class字节码文件接下来的两个数,即主副版本号,比如50.0代表1.6。
- 验证Class编译得对不对,比如常量池、访问标识、字段、方法等。
- 分级的ClassLoader
- Bootstrap ClassLoader
- Extension ClassLoader
- App ClassLoader
- App ClassLoader必须一级级请示上级是否已经加载了该class(上级加载过就不用再重复加载了),因为有一些String、ArrayList这样的重要类,由核心ClassLoader去加载,避免黑客搞一些同名的会进行攻击的class被App ClassLoader加载进来被运行
- JVM虚拟机
- 方法区
- Java函数栈
- 每个线程会有一个
- 包含多个栈帧,即依次多个函数调用
- 栈帧
- 一旦调用一个新方法,就会形成一个新的栈帧
- 每个栈帧中都有一个函数变量区和一个操作数栈
- 局部变量区
- 操作数栈
- 先进先出
- 举例来说,通常会根据指令(如a+b),将当前指令需要的变量(a、b)从局部变量区放到操作数栈中,然后再执行加法操作指令
- Java函数栈
- 根据类创建出的对象被放在堆中
- 每个线程在运行时,如果需要用到某个类的方法,会根据地址(?)去向类要并执行方法对应的一条条指令
- 垃圾回收
- 清理者
- JVM虚拟机可以使用多少内存,是在启动虚拟机时通过参数由码农指定的
- 如果不清理,很快就会用完内存,系统崩溃,Out Of Memory
- 通过可达性分析来确定需要清理哪些对象
- 从GC Roots对象节点出发,四处搜索被GC Roots直接引用的对象,再一层层去找引用链条上的对象,如果不在这些链条上,那么就很有可能被清理。
- 方法区