JVM 面试整理

  • JVM 内存结构,运行时数据区各模块什么作用、存放什么数据

jvm 内存结构包含:

  1. heap堆区:负责存放所有的 对象以及数据,是线程共享的。
  2. 本地方法栈:本地方法调用过程中,虚拟机会创建栈帧放入到本地方法栈中,维护的是方法的调用栈帧
  3. 虚拟机栈:Java 方法调用的栈帧存放的地方,内部有:局部变量表、操作数栈、方法出口等。
  4. 方法区:方法区也称”永久代“,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域
  • 双亲委派模型?为什么需要自定义加载器?

在类加载过程中,双亲委派机制保证了类的安全性,保证了类不被多个classLoad 重复加载,具体的加载过程为:当classLoad在加载一个class 的时候,首先会判断当前类有没有被自己加载,如果没有则会交给上级的类加载器加载。
整个加载过程为:启动类加载器 > 扩展类加载器 > 应用类加载器 > 自定义类加载器
上诉是整个双亲委派模型,那么为什么要自定义类加载器呢?
-- 是因为整个类加载器加载的都是固定路径下的类,如果需要我们需要加载一些自定义的类(来源)那么就需要实现自己的类加载器。
主要实现方式是:继承ClassLoad 类 并重写 findClass 方法
loadClass:类加载搜索算法
findClass: 类加载实现

  • GC 如何识别垃圾,GC 算法有哪几种

GC 识别算法主要有两种:

  1. 对象引用法:对象每次一被引用就在对象引用计数器上加一,每次被回收,对象就减一,根据当前对象的引用是否为0 ,判断是否需要清除。无法解决对象互相引用的问题,导致这类对象迟迟无法被垃圾回收器回收
  2. 根可达性分析算法:以虚拟机栈中、常量池中的对象作为GCroot,分析是否有被这些对象引用,无引用的对下即为垃圾对下,可被垃圾回收器回收。相比对下引用发 该算法对无用对象的标识比较清楚。
  • jvm 为什么需要分代回收机制?垃圾收集器了解多少种? 为什么会弃用 CMS?
  1. 首先我们在JVM 里面有多种垃圾回收算法,各有各的优势跟缺陷
    a 标记-清除算法:经历两个阶段,先标记垃圾,在进行清除,占用空间较少,但会产生内存碎片。
    b 标记-整理算法:先标记垃圾,在进行整理,不会产生内存碎片,但是收集回收时间较长
    c 标记-复制算法:先标记垃圾,在进行复制,不会产生内存碎片,但是会占用2倍的内存空间。
  2. 基于以上算法,将JVM的堆区按照对下的存在年龄时长划分了年轻代跟老年代,在不同的区域下使用不同的垃圾回收算法,这样能够最终达到高效的JVM 回收算法。
  3. 各个分代特点:
    a. 年轻代对象的特点是:朝生夕死的对下比较多,比较适用于标记-复制算法
    b. 老年代的对下的特点是:不是很容易被垃圾回收器回收,相对回收的次数会少一点,所以比较适用于标记-整理算法。
  4. 基于以上模型出现了很多垃圾回收器?
    a. Serial:单线程垃圾回收,STW 时间较长
    b. ParNew :多线程垃圾回收,STW 相较 Serial会比较短。
    c. ps:多线程自适应垃圾回收器,对于分代年龄、年轻代的区域大小进行动态调整。
    d.CMS:针对老年代进行的垃圾回收算法,利用的是 标记-清除算法,将整个垃圾回收过程分为:初始标记-并发标记(与用户线程一起工作)-重新标记-并发清除。减少了 STW 时间,但是会产生内存碎片。
    f. G1: 主要是将整个Java 堆区 分成多个大小独立的 region ,通过监控每个region 找到需要最先进行垃圾回收的区域进行回收,针对 GC-root 需要扫描整个heap 区域的问题,使用预测的可停顿模型。

你可能感兴趣的:(JVM 面试整理)