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