JVM 学习
经典面试题
内存管理
- 介绍下 Java 内存区域(运行时数据区)
- (方法区、堆)线程共享,不安全
- (栈、本地方法区、程序计数器)线程独享,安全
- Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)
1. - 对象的访问定位的两种方式(句柄和直接指针两种方式)
垃圾回收
- 如何判断对象是否死亡(两种方法)。
- 引用计数法
- 给对象中添加一个引用计数器
- 每当有一个地方引用它,计数器加一
- 当引用失效时,计数器减一
- 任何时候计数器为0都说明对象不可能再被使用了
- 此方法简单,效率高。但目前主流的虚拟机并没有使用该方法,因为无法解决循环引用问题
- 给对象中添加一个引用计数器
- 可达性分析算法
- 基本思想是通过一些列“GC root” 的对象作为起点,从这些节点向下搜索,节点走过的路径称为引用链,当一个对象到GC root没有任何引用链的时候,则证明该对象是不可用的,需要回收。
- 引用计数法
- 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。
- 强引用
- 软引用
- 弱引用
- 虚引用
- 如何判断一个常量是废弃常量
- 没有被任何String对象引用的常量就是废弃常量
- 如何判断一个类是无用的类
- 三点
- 加载该类的Classloader被回收
- 类对应的实例都被回收
- 该类对应的java.lang.class对象没有在任何地方被引用,也无法通过反射机制访问该类的方法
- 三点
- 垃圾收集有哪些算法,各自的特点?
- 标记清除-容易产生碎片
- 标记复制-占用空间比较大
- 标记整理-
- 分代回收- 将java堆中的对象分为新生代、老年代和永久代
- HotSpot 为什么要分为新生代和老年代?
- 方便垃圾回收,新生代每次回收都会有大量对象死去,因此选用标记清除算法,每次只需要少量的对象复制空间即可完成回收;而老年代多是存活纪律较高的对象,而且没有额外的空间去怼他进行分配担保,所以选用标记清除或标记整理进行回收
- 常见的垃圾回收器有哪些?
- serial收集器
- parNew
- Parallel Scavenge
- Serial Old
- Parallel Old
- CMS
- 以获取最短回收时间为目标的收集器,第一个真正的并发收集器
- G1
- ZGC
- 介绍一下 CMS,G1 收集器。
1. - Minor Gc 和 Full GC 有什么不同呢?
- Minor GC 回收年轻代
- Full GC: 负责从整个内存区回收
JVM 学习
https://kkkkkong.github.io/posts/34491.html