jvm|「2022最新JVM面试题」10道不得不会的JVM面试题( 三 )

  • 如果父类加载器可以完成类加载任务 , 就成功返回 , 倘若父类加载器无法完成此加载任务 , 子加载器才会尝试自己去加载 , 这就是双亲委派模式 。
  • 为什么要使用双亲委派模型可以防止内存中出现多份同样的字节码 , 如果没有双亲委派模型而是由各个类加载器自行加载的话 , 如果用户编写了一个java.lang.Object的同名类并放在ClassPath中 , 多个类加载器都去加载这个类到内存中 , 系统中将会出现多个不同的Object类 , 那么类之间的比较结果及类的唯一性将无法保证 , 而且如果不使用这种双亲委派模型将会给虚拟机的安全带来隐患 。 所以 , 要让类对象进行比较有意义 , 前提是他们要被同一个类加载器加载 。
    9. CMS垃圾清理的过程
    CMS整个过程比之前的收集器要复杂 , 整个过程分为4个主要阶段 , 即初始标记阶段、并发标记阶段、重新标记阶段和并发清除阶段 。 (涉及STW的阶段主要是:初始标记 和 重新标记 stop-the-world)
    • 初始标记(Initial-Mark)阶段:在这个阶段中 , 程序中所有的工作线程都将会因为“stop-the-world”机制而出现短暂的暂停 , 这个阶段的主要任务仅仅只是标记出 GC Roots 能直接关联到的对象 。 一旦标记完成之后就会恢复之前被暂停的所有应用线程 。 由于直接关联对象比较小 , 所以这里的速度非常快 。
    • 并发标记(Concurrent-Mark)阶段:从 Gc Roots 的直接关联对象开始遍历整个对象图的过程 , 这个过程耗时较长但是不需要停顿用户线程 , 可以与垃圾收集线程一起并发运行 。
    • 重新标记(Remark)阶段:由于在并发标记阶段中 , 程序的工作线程会和垃圾收集线程同时运行或者交叉运行 , 因此为了修正并发标记期间 , 因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录 , 这个阶段的停顿时间通常会比初始标记阶段稍长一些 , 但也远比并发标记阶段的时间短 。
    • 并发清除(Concurrent-Sweep)阶段:此阶段清理删除掉标记阶段判断的已经死亡的对象 , 释放内存空间 。 由于不需要移动存活对象 , 所以这个阶段也是可以与用户线程同时并发的
    • 私信回复“666”可获取更多JVM资料及面试题 。
    10. 常用的 JVM 调优的参数都有哪些?
    • -XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
    • -XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
    • –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
    • -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
    • -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
    • -XX:+PrintGC:开启打印 gc 信息;
    • -XX:+PrintGCDetails:打印 gc 详细信息 。