Java从编译到执行的过程
编译
语法分析
语义分析
注解处理
class文件
加载
加载
-
装载(p263)
-
装载时机
- 为节省内存开销并不会一次性将所有类加载进JVM中。先保证程序正常运行所需要的基础类完全加载,其他类需要的时候再加载。
-
装载规则
-
类加载器(通过类加载器加载到jvm中)
-
启动(Bootstrap)
- java核心类库
- java、javax、sun
- 本地方法
-
拓展(Extension)
-
应用程序、系统(APP)
- 程序中的类文件
- 用户类数据
- 当前应用的classpath下的所有类
连接
初始化
-
为类静态变量赋予正确的初始值
-
收集静态代码块、变量至(),随后从上往下开始执行 -
执行构造器
- 如果实例化对象则会调用方法对实例变量进行初始化,并执行对应的构造方法内的代码
解释(P389)
类型
方式
热点代码
- 触发JIT,保存热点方法的指令码,下次此无需重复进行解释,提高解释速度,直接执行缓存的机器语言
- 非热点代码直接解释
热点探测
-
计数器(hotspot)超阈值触发JIT
-
方法调用计数器
- 默认阈值在C端是1500次,S端10000次
- 方法调用计数器热度衰减(半衰期)
-
回边计数器
-
抽(采)样
执行
OS把解释器解析出来的指令码调用系统的硬件执行最终的程序指令
把字节码转化为os识别的指令(机器指令码)
泛型擦除
泛型:只在java源码中存在
擦除:被替换为原生类型 rowtype
优点
- 简洁(不需要强制转型)
- 健壮(运行时不会抛出classcast异常)
- 可读性、稳定性
通过Javac.exe编译.java原代码文件生成.class文件交由JVM运行
JVM面向OS,JDK中包含JVM,Java依赖JVM实现跨平台性
六种情况立即装载
new实例化对象
反射
启动类包含main主类
某类子类先触发其父类初始化
jdk7动态语言,jdk8…
|