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的时候对象要放入老年代,而此时老年代空间不足导致的