java编码至执行
JDK JRE JVM
JDK = JRE + development kit
JRE = JVM + core lib
JVM
ClassLoader 加载进内存过程
- 周期: loading -> linking -> initializing -> GC
- XX.class 通过"loading"进JVM的ClassLoader
- linking包括verification, preparation 和 resolution, verification校验16进制的class文件开头cafebaby和0034(版本号)等信息
- preparation 将静态变量赋值默认值(如: 0 , 空串("")等)
- resolution将符号引用先转换成具体内存地址值
- initializing 将静态变量值进行赋值为定义值
- GC回收
ClassLoader 加载器
Bootstrap(加载lib/rt.jar charset.jar等核心类, C++实现)
Extension(加载扩展jar包jre/lib/ext/*.jar 或由-Djava.ext.dirs指定)
App(加载classpath指定内容)
Custom(自定义ClassLoader)
- JVM是按需动态加载, 采用双亲委派机制
- 自底向上检查该类是否已经加载(parent方向), 找到则返回"已加载"(到Bootstrap还未找到则走3.的步骤)
- 自顶向下进行实际查找和加载(child方向), 查找到当前加载器中可加载该class则返回"已加载(且缓存)", 若至Custom还未找到则报Class Not Found异常
为了安全, 避免自定义的class替换掉了java的核心类库, 比如使用三方自定义String类(加入发送用户名密码功能), 替换了项目本身的String就会泄露信息了
code可以通过(XXX.class.getClassLoader 获取, 例: String.class.getClassLoader(), 返回null, 因为Bootstrap由C++实现, java中无该类)