(1)请详细说说你所知道的Java类的生命周期。
- 验证一下这个类是否合法
- 类的静态变量分配内存并设为jvm默认的初值
- 初始化:如果一个类被直接引用,就会触发类的初始化
- 使用:
- 加载该类的ClassLoader已经被回收
- 该类对应的java.lang.Class对象没有任何地方被引用
(2)Java是如何对运行时数据区进行划分的?为什么要这么划分? - 元空间、堆、虚拟机栈、本地方法栈和程序计数器
- 主要是为了方便垃圾收集器对对象进行管理
(3)详细说一下虚拟机为Java对象分配内存的过程,越详细越好。 - 依据逃逸分析,如果未逃逸则把对象分配到VM Stack中
- 否则判断大对象,如果是则直接分配到堆上 Old Generation 老年代上
- 否则判断是否可以在 TLAB(线程分配缓冲区)中分配,如果是在 TLAB中分配
- 否则,在共享的Eden区分配。
(4)假设年轻代采用复制算法,老年代采用“标记-整理”算法管理虚拟机堆时,当线上发生YGC过于频繁、YGC的STW过长、FGC过于频繁、FGC的STW过长这几种情况时,请列举每个现象发生的可能原因,要有理有据。例如,YGC频繁,那么可能是年轻代采用了单线程的复制算法导致内存回收效率低下,而内存的分配速度大时就造成了年轻代的内存吃紧,又或者年轻代分配的内存过小而又不能动态扩容的情况下导致频繁YGC。
- Young/Eden 区过小
- System.gc频繁调用
- Young/Eden 区过小
- System.gc频繁调用
|