Fork me on GitHub

JVM面试题总结

  1. 为什么堆区域采用分代?
  • 年轻代一般放新创建的对象,内存占用小,GC频繁但时间短。
  • 老年代存放生命周期长的对象,内存占用大,GC不频繁时间长。
  • 这样分代按照对象生命周期划分了区域,绝大部分都在年轻代创建之后被回收,实在不行还可以晋升老年代,有一定缓冲和保护内存的作用。
  1. 新生代为什么选择复制算法?为什么会有Survivor区域
  • 新生代分为Eden、S0、S1区,S区一个时间只能使用一个。新创建的对象会首先分配在Eden区,如果Eden不够会MinorGC放入S0区,下次MinorGC会清理Eden和S0,将存活对象复制到S1区。
  • 划分Survivor区主要是为了实现复制算法,复制算法的好处是复制之后内存是规整的,可以采用指针碰撞的方式来移动指针分配内存,不会有空间碎片。且复制之后可以一次性清除一个被复制的区域,效率高;缺点是只利用了一般的Survivor区域,利用率低。但是一般对象会在MinorGC之后被回收,存活对象很少,所以Survivor区不会很大。
  1. jdk有哪些类加载器?
  2. 双亲委派模型?
  3. 如何打破双亲委派模型?有哪些实例是打破的?
  4. 类加载的过程,每一步都干了什么?
  5. JVM内存区域模型描述一下。
  6. 如何判定一个对象是垃圾对象?
  7. 哪些对象可以作为GCRoots?
  8. 为什么标记不采用引用计数法?
  9. CMS垃圾回收有哪些过程?
  10. 什么操作或者场景下发生FullGC
  11. 描述一下java对象四种引用和应用场景。
  12. new一个对象一定堆上分配吗?
  13. 逃逸分析和标量替换是什么?
  14. JIT编译会做哪些事情?
  15. 常见的垃圾回收器及其特点?
  16. CMS垃圾收集器一定不会STW吗?哪些阶段会STW,哪些阶段会并发执行?
  17. 描述一下Java对象的结构?对象头中的结构?
  18. G1垃圾回收器的特点什么?
  19. G1垃圾回收器和CMS的区别是什么?
  20. 常用的JVM参数有哪些?
  21. 常用的JDK调优工具有哪些?
  22. 线上CPU打满怎么排查?
  23. 内存泄漏和内存溢出有什么区别?
  • 内存泄漏:已经无用的对象还被GCRoots连通引用,被标记为存活无法回收,
  • 内存溢出:当前内存不足以开辟出连续内存用来分配对象,则会内存溢出。
  1. OOM有哪些类型?怎么排查OOM?
  • OOM:unable to create new native thread。线程栈也是堆内存的一部分,当无法创建机器的native线程会报错OOM。
  • OOM:MetaSpace。元空间无可用内存会OOM,比如加载了很多类或者动态生成了很多类,导致元空间内存溢出。
  • OOM:heapSpcae。堆空间内存溢出,比如老年代FullGC之后还是没有足够空间,则会OOM
  • OOM:directMemory。直接空间(堆外内存)不足也会造成OOM。
  1. 线上JVM调优经验?
  2. 线上其他问题排查经验?
  3. 线上频繁出现FullGC怎么排查?
  4. 什么是老年代空间担保机制? promotion failure
  5. 在CMS中,什么是Concurrent mode failure,怎么触发的,有什么结果?
  6. 元空间不足会FullGC吗?元空间的参数不设置会怎么样?
  7. 线程的状态有哪些?调用sleep和Locksupport.park、synchronized锁阻塞、lock.lock分别是什么状态?
  8. 常量池在JVM内存的哪个区域?常量池中存放的是什么?
  9. JVM内存模型中,线程私有的区域都有哪些?
  10. 什么是直接内存?怎么应用?怎么对直接内存进行垃圾回收。
  11. OOM之后的Dump文件很小,且分析没有异常,可能是发生什么?
  12. 什么是栈帧?栈帧中存放哪些结构?
  13. 1.7的方法区和1.8的元空间有什么区别?为什么要废弃方法区?常量池和静态变量1.8jdk在哪个区域?
-------------本文结束感谢您的阅读-------------

本文标题:JVM面试题总结

文章作者:夸克

发布时间:2021年10月01日 - 10:10

最后更新:2022年07月01日 - 10:07

原始链接:https://zhanglijun1217.github.io/2021/10/01/JVM面试题总结/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。