一、通过学习JVM 需要了解那些东西?
1、深入了解 JVM 的内存模型和 Java 的内存模型;
2、要了解类的加载过程,了解双亲委派机制;
3、要理解内存的可见性与 Java 内存模型对原子性、可见性、有序性的保证机制;
4、要了解常用的 GC 算法的特点、执行过程,和适用场景,例如 G1 适合对最大延迟有要求的场合,ZGC 适用于 64 位系统的大内存服务中;
5、要了解常用的 JVM 参数,明白对不同参数的调整会有怎样的影响,适用什么样的场景,例如垃圾回收的并发数、偏向锁设置等。
6、知道在编程时如何合理利用栈上分配降低 GC 压力、如何编写适合内联优化等代码等。
7、解决过线上经常 FullGC 问题,排查过内存泄露问题等。
8、针对高并发低延迟的场景,如何调整 GC 参数尽量降低 GC 停顿时间,针对队列处理机如何尽可能提高吞吐率等;
9、了解 ZGC 高效的实现原理,了解 Graalvm 的特点等。
二、其他问题
1、什么情况下回触发FullGc?
年轻代进入老年代时空间不足、永久代空间不足(PermGen/Metaspace)
2、Java类加载器有几种?关系是什么?
3、双亲委派的加载流程是什么?好处?
4、1.8 为什么用Metaspace 替换掉PermGen? Metaspace 保存在哪里?
5、编译期会对指令做那些优化?(编译器的指令重排)
6、olatile 可以解决什么问题?如何做到?
强制主内存读写同步、防止指令重排序
7、GC 的分代回收?
8、对象引用的几种方式?什么特点?
强、弱、软、虚 在Gc 中的处理方式
9、JVM 调试工具,主要分析那些内容?
MC 中的飞行记录器,堆分析工具 MAT,线程分析工具 jstack 和获取堆信息的 jmap 等。
10、G1 与CMS 的区别?