废话不多说,先上一张图
1、“加载”过程做了什么?什么是双亲委派?为什么要使用双亲委派机制?有什么利弊?
**加载:**就是将编译后的.class字节码文件【jvm只认.class文件,.class文件也并非只有java编译后才能是.class文件】,load到方法区【jdk 1.7以前叫永久代,1.8以后就叫元数据区:meta space】。在加载的过程中并不会拿过来字节码文件就加载,而是从Custom classloader缓存一层层往上找,直到Bootstrap classloader,找到了就不再加载,找不到后会从Custom classloader返回往下,看该字节码应该属于哪一个加载器去加载,然后它自己去加载,这就是双委派机制。
**使用双亲委派机制的原因是:**安全,避免用户自己随意定义一些非法或者不符合定义规范的类,比如你自定义一个:java.lang.String,这样会引起错乱。
**2、验证或者校验过程做了什么?
就是检查字节码文件是否合法,比如:字节码开始是否按规定、字节码文件是否被编译后篡改等,就是为了下一步的解析做好准备,避免非法字节码被携带进入后续流程。
3、准备过程做了什么?【很重要】
为静态变量赋初始值,这个值是默认的初始值哦。
4、解析过程做了什么?
将上一步常量池里面的变量的符号引用换成直接内存地址引用。
5、初始化过程做了什么?
静态变量赋初始值,有可能会将默认的值给替换掉。
6、对象被调用的几种方式你知道吗?
属性注入、构造函数注入、new
7、了解GC吗?常用的垃圾收集器有哪些?分别有什么特点?垃圾标定算法有哪些?垃圾清除方式有哪些?**
//TODO