JVM面试题

  1. 背景

    储备足够多的知识是解决JVM调优的必要条件,努力掌握每一次机会,不断地去尝试,才能提高自己的水平

  2. 面试题记录

    2.1. 解释#年轻代垃圾回收机制

    -Xms3G , -Xmx3G, -Xmn1G, -XX:SurvivorRatio=8 -XX:PrintGCDetails, -verbose:gc

    eden区发生minor gc的时候有95% 以上的对象是垃圾对象

    2.2 JVM调优

    现象: TP99耗时偏高,有明显的毛刺,发现YGC和FGC频繁

    解决: 频繁的YGC导致本该在YGC就被回收的对象进入了老年代,也导致了老年代继续触发FGC,频繁的STW,导致TP99偏高

    优化目标:减少YGC的次数和耗时,减少FGC的次数和耗时

  • 放大年轻代
  • 元数据区的默认初始值只有21M,如果动态代理对象比较多,就会导致元空间进行FGC,导致STW,观察了一下元空间常住对象的大小,大概100M,直接指定元空间和最大容量为256M,防止动态调整
  • 使用并发预清理
  • 2.3 jvm垃圾回收算法

    标记清除

    复制算法

    标记整理压缩

    分代收集

    2.3 三色标记法

    黑白灰,初始状态,所有的对象都是白色的,只有GC Roots是黑色的,

    白色代表没有被垃圾回收器访问过,黑色表示对象已经被GC收集器访问过,且这个对象的所有引用都已经被扫描过, 灰色表示至少存在一个引用没有被扫描过

    原始快照和增量更新

    2.3 双亲委派机制

    类加载器就是用来把类加载到jvm中的一种东西,对于任何一个类,由他的加载器和它本身确定在jvm中的唯一性,

    引导类加载器、扩展类加载器、应用类加载器、用户自定义加载器,用户可以继承ClassLoader类,实现其中的findClass方法来实现自定义的类加载器

    保护核心类的安全,防止被篡改, 避免类的重复加载,一个类只会被加载一次

    2.4 java中的强引用,软引用,弱引用,虚引用

    强引用,宁可OOM,虚拟机也不会回收持有强引用的对象, 软引用在jvm oom之前会回收到软引用对象 SoftReference和weakReference,不管内存足不足弱引用只要GC就会被回收

    2.5 JVM的类加载机制

    加载,连接, 初始化,使用,销毁

    2.6 JVM什么时候 FGC

    system.gc()

    老年代空间不足

    promotion failed 是在minor gc的时候,survivor space 放不下对象放入老年代,老年代也放不下导致的

    concurrent mode failure 是在执行FGC的时候对象要放入老年代,而此时老年代空间不足导致的