JVM 学习

经典面试题

内存管理

  1. 介绍下 Java 内存区域(运行时数据区)
    1. (方法区、堆)线程共享,不安全
    2. (栈、本地方法区、程序计数器)线程独享,安全
  2. Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)
    1.
  3. 对象的访问定位的两种方式(句柄和直接指针两种方式)

垃圾回收

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

JVM 学习
https://kkkkkong.github.io/posts/34491.html
作者
Kong Weichao
发布于
2023年2月22日
许可协议