一、本质
虚拟机的本质是将class文件转换成操作系统具体指令。
二、JDK的类加载体系
- 每个类加载器对加载过的类保持一个缓存。
- 双亲委派(向上委托查找,向下委托加载)
- 沙箱保护
打破双亲委派
- Tomcat每个容器配置一个类加载器实现缓存隔离。
- 通过秘钥修改Class文件(需要解密后执行)。
类和对象之间的关系
类信息存储在元数据里,对象一般存在堆中,对象指针指向元数据对应的类信息。
三、执行引擎
解释执行与编译执行
- 解释执行:相当于同声传译。JVM接收一条指令,就将这条指令翻译成机器指令执行。
- 编译执行:相当于提前翻译。好比领导发言前就将讲话稿翻译成对应文本,上台讲话就可以照着念,也就是JIT。(例如在HotSpot中会搜集热点代码,形成CodeCache,放到元空间中,后续执行无需编译直接就可以执行了)。
- JDK中默认采用混合执行,它会自己检测使用哪种方式效率高,一般无需干涉。(编译执行预热慢)。
- 编译器有C1和C2两种(默认C2),分别适用于应用端和服务端。C1编译速度快执行慢,C2相反。
静态执行与动态执行
静态执行指的是在Class文件编译过程中已经确定了执行方法,而动态执行更多关联到invokedynamic指令(函数式编程)。
四、GC垃圾回收
GC日志参考配置:
java
-Xms60m -Xmx60m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -Xloggc:./gc.log