⑥②. Java对象头里有什么?
- ①. 对象标记Mark Word(哈希值(HashCode )、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳)
- ②. 类元信息
⑥③. 谈谈你对执行引擎的理解?
①. 执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以
②. 解释器(负责响应时间):当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行
③. JIT(负责性能) (Just In Time Compiler)编译器(即时编译器):就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言
JLT是基于计数器的热点探测技术将热点代码进行缓存,主要分为基于:方法调用计数器用于统计方法的调用次数;回边计数器则用于统计循环体执行的循环次数
⑥④. 你是怎么指定JVM启动模式?
- java -version
⑥⑤. 那你知道-server(c2)和-client(c1)的区别吗?
- C2编译器启动时长比C1编译器慢,系统稳定执行以后,C2编译器执行速度远远快于C1编译器。
⑥⑥. 为什么有了AOT静态提前编译,我们没用?而是用的JLT编译器?
- ①. 使用JLT编译器,针对的是字节码文件,可以跨平台
- ②. 可以在动态期间对齐进行优化,比如:逃逸分析优化(逃逸分析优化可以有如下几种:栈上分配、标量替换、同步消除)
⑥⑦. 什么是垃圾?
- 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾
⑥⑧. Java中垃圾回收的重点区域是?
- ①. 垃圾回收器可以对年轻代回收,也可以对老年代回收,甚至是全堆和方法区的回收
- ②. 从次数上讲:
频繁收集Young区
较少收集Old区
基本不动Perm区(或元空间)
⑥⑨. 谈谈你对垃圾判别阶段算法都有哪些?
- ①. 引用计数算法
- ②. 可达性分析算法
⑦0. 引用计数算法
①. 原理:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了,可以被回收
②. 最大的缺陷:无法解决循环引用的问题,gc永远都清除不了(这也是引用计数法被淘汰的原因)
③. Java使用的不是引用计数法(Java之所以没有使用引用计数法,是由于不能解决循环引用问题) | (Python使用了是引用计数法)
④. Python如何解决循环引用( 扩展了解 )
手动解决:很好理解,就是在合适的时机,解除引用关系
使用弱引用weakref,weakref是Python提供的标准库,旨在解决循环引用(只要发生了回收,弱引用都会被回收)
⑦①. 你对枚举根节点做可达性分析了解吗?
①. 基本思路是通过一系列名为"GC Roots"的对象(集合)作为起点,从这个被称为GC ROOTs 的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象是不可达对象(被回收),否则就是可达对象