前言
最近在准备面试整理了份JVM的脑图,不够的话可以评论区一起补充!共同进步
大纲
JVM结构
真个JVM的结构
jdk和jre和jvm的关系
类加载过程
类加载器的加载过程
类加载器的分类(只用两种)
引导类,扩展类,系统类加载器分别做什么的?
用户自定义的类加载器
双亲委派机制
双亲委派模式的优势
扩展类加载器的parent为null,为什么父类加载器是启动类加载器
破坏双亲委派机制的例子
沙箱机制(自定义String会如何执行)
运行时数据区
java内存模型和java内存布局的区别?
运行时数据区的结构分布 / java内存结构
程序计数器
为什么使用PC寄存器记录当前线程执行地址
PC寄存器为什么会被设定为线程私有
虚拟机栈
什么是虚拟机栈
虚拟机栈的生命周期
作用
优点
原理
栈开发中遇到的异常
栈的内部结构
局部变量表
操作数栈
动态链接
方法返回地址
附加信息
本地方法栈
JNI本地方法接口
堆
内存细分
如何设置内存大小
新生代和老年代
会先分配空间过程
对象分配内存的特殊分配过程
内存分配策略总结(空间分配担保策略+动态年龄判断)
Minor GC 和Major GC 和 Full GC的对比[面试重点]
有没有单独对老年代进行的GC
为什么堆空间使用分代思想
堆是分配对象存储的唯一选择吗?
逃逸分析-栈上分配
区分栈上分配和栈上替换
逃逸分析-同步省略
逃逸分析-标量替换
堆中的对象的内存布局[面试] (对象头+示例数据+对齐填充)
从JVM的角度看String对象+intern()方法
G1中的String去重操作
String为什么不可变
方法区
永久代和元空间的区别
运行时常量池
方法区演进细节,jdk6-jdk7-jdk8变化[面试 会问不同jdk方法区有什么变化]
为什么永久代被替换成了元空间?? [面试]
StringTable为什么要放到堆?
静态变量存在哪?
方法区的垃圾回收
执行引擎
为什么说JAVA是半编译半解释型语言??
热点代码探测何时使用JIT编译器
垃圾收集器和内存分配策略
判断对象是否存活的算法
引用计数算法
可达性分析算法
引用的分类(强-软-弱-虚)
finalize()方法
垃圾收集算法
分代收集理论(思想)
1.标记-清除算法
2.标记-复制算法 (Appel式回收的应用)
3.标记-整理算法(吞吐量概念)
3.1标记清除和标记整理的权衡
HotSpot的算法实现细节
1.根节点枚举(Hotspot的OopMap快速找到CGROOT)
2.安全点(安全点的选择 + HotSpot汇编侧面上实现原理)
3.安全区域
4.记忆集和卡表(用于解决跨代引用的临时CGROOT)
5.写屏障(写前or后屏障 + 伪共享问题)
6.并发可达性分析(节点消失问题,和解决方案)
经典的垃圾回收器(重点是CMS和G1)
1.不同的垃圾收集器的搭配
2.Serial收集器
3.serial old收集器
4.ParNew收集器(并行)
5.Parrallel Scavenge(并行,吞吐量优先,自适应内存调节)
6.parallel old收集器(并行,吞吐量优先)
7.CMS(并发,低延迟,淘汰的原因缺点)**重点
8.G1收集器(停顿预测模型+实现原理,何为价值)
G1区域间存在跨域的引用对象怎么办?
G1并发标记的阶段如何保证收集线程和用户线程互不干扰
G1如何建立可靠的停顿预测模型?
G1的运作过程大概分为四个步骤**重点
G1和CMS的比较**重点
9.ZGC收集器
Minor GC和Full GC触发条件
Java虚拟机内存OOM
Java 如何防止OOM的 ( 回答了 GC 的分代回收 与 内存分配策略 )
什么时候执行STOP THE WORLD?
不同版本垃圾回收器的默认搭配
JVM调优
如果web服务器突然出现频率很高的FullGC,可能是什么原因?你会怎么去排查呢?
jvm排查命令
如何定位OOM
假如现在在同一台机器上开两个java项目,有几个java虚拟机?
常用的JVM参数