深知我整理的面试题库里缺了一些主流又必会的技术栈,比如 JVM、Mybatis、Spring 全家桶、Docker、Kafka、微服务分布式 等。

自己把握不准的,写出来就是误导别人,所以宁缺毋滥。之前那 32 道 MyBatis 面试题,我都是对着官方文档,源码翻了一遍又一遍,写了测试 Demo 代码,看完了《MyBatis从入门到精通》、《MyBatis技术内幕》两本书,总结的答案。可能没那么精炼,也存在笔误,但绝对经得住你的质疑。

图片



JVM 的面试题,亦是如此。周志明的《深入理解 Java 虚拟机》,最近刚看完第三遍,分享了笔记思维导图,也看了两个付费专栏,我自己是收获良多。


话不多说!


1、对象在哪块内存分配?

数组和对象在堆内存分配;某些对象没有逃逸出方法,可能被优化为在栈上分配


2、谈谈 JVM 中的常量池

JDK 1.8 开始

字符串常量池:存放在堆中,包括 String 对象执行 intern() 方法后存的地方、双引号直接引用的字符串

运行时常量池:存放在方法区,属于元空间,是类加载后的一些存储区域,大多数是类中 constant_pool 的内容

类文件常量池:constant_pool,JVM 定义的概念


3、谈谈动态年龄判断

这里涉及到 -XX:TargetSurvivorRatio 参数,Survivor 区的目标使用率默认 50,即 Survivor 区对象目标使用率为 50%。


Survivor 区相同年龄所有对象大小的总和 > (Survivor 区内存大小 * 这个目标使用率)时,大于或等于该年龄的对象直接进入老年代。


当然,这里还需要考虑参数 -XX:MaxTenuringThreshold 晋升年龄最大阈值


4、谈谈永久代

JDK 8 之前,Hotspot 中方法区的实现是永久代(Perm)

JDK 7 开始把原本放在永久代的字符串常量池、静态变量等移出到堆,JDK 8 开始去除永久代,使用元空间(Metaspace),永久代剩余内容移至元空间,元空间直接在本地内存分配。


5、JVM 有哪些运行时内存区域?

Java 8

  • The pc Register,程序计数器

  • Java Virtual Machine Stacks,Java 虚拟机栈

  • Heap,堆

  • Method Area,方法区

  • Run-Time Constant Pool,运行时常量池

  • Native Method Stacks,本地方法栈

摘自:

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5


6、运行时栈帧包含哪些结构?

  • 局部变量表

  • 操作数栈

  • 动态连接

  • 返回地址

  • 附加信息


7、JVM 的内存模型是什么?

JVM 试图定义一种统一的内存模型,能将各种底层硬件以及操作系统的内存访问差异进行封装,使 Java 程序在不同硬件以及操作系统上都能达到相同的并发效果。它分为工作内存和主内存,线程无法对主存储器直接进行操作,如果一个线程要和另外一个线程通信,那么只能通过主存进行交换。


8、JVM 如何确定垃圾对象?

JVM 采用的是可达性分析算法,通过 GC Roots 来判定对象是否存活,从 GC Roots 向下追溯、搜索,会产生 Reference Chain。当一个对象不能和任何一个 GC Root 产生关系时,就判定为垃圾。


9、哪些是 GC Roots?

  • 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。

  • 在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。

  • 在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。

  • 在本地方法栈中JNI(即通常所说的Native方法)引用的对象。

  • Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如 NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。

  • 所有被同步锁(synchronized关键字)持有的对象。

  • 反映 Java 虚拟机内部情况的 JMXBean、JVMTI中注册的回调、本地代码缓存等。


10、被引用的对象就一定能存活吗?

不一定,看 Reference 类型,弱引用在 GC 时会被回收,软引用在内存不足的时候,即 OOM 前会被回收,但如果没有在 Reference Chain 中的对象就一定会被回收。


11、强引用、软引用、弱引用、虚引用是什么,有什么区别?

  • 强引用,就是普通的对象引用关系,如 String s = new String("ConstXiong")

  • 软引用,用于维护一些可有可无的对象。只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。SoftReference 实现

  • 弱引用,相比软引用来说,要更加无用一些,它拥有更短的生命周期,当 JVM 进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。WeakReference 实现

  • 虚引用是一种形同虚设的引用,在现实场景中用的不是很多,它主要用来跟踪对象被垃圾回收的活动。PhantomReference 实现


12、你做过 JVM 调优,说说如何查看 JVM 参数默认值?

  • jps -v 可以查看 jvm 进程显示指定的参数

  • 使用 -XX:+PrintFlagsFinal 可以看到 JVM 所有参数的值

  • jinfo 可以实时查看和调整虚拟机各项参数


未完,待续...


13、你平时工作中常用的 JVM 配置参数有哪些?

14、谈谈对 OOM 的认识

15、什么情况发生栈溢出?

16、你都有哪些手段来排查 OOM 的问题?

17、谈谈你的知道的垃圾收算法和垃圾收集器

18、生产环境用的什么JDK?如何配置的垃圾收集器?

19、如何查看 JVM 当前使用的是什么垃圾收集器?

20、如何开启和查看 GC 日志?

21、JVM 监控与分析工具你用过哪些?介绍一下。

22、JIT 是什么?

23、谈谈双亲委派机制

24、列举一些你知道的打破双亲委派机制的例子。为什么要打破?

25、说一下垃圾分代收集的过程

26、如何找到死锁的线程?

27、invokedynamic 指令是干什么的?

28、什么是方法内联?

29、什么是逃逸分析?

30、描述一下对象从年轻代进入老年代的过程

31、safepoint 是什么?

32、MinorGC、MajorGC、FullGC 什么时候发生?

33、说说类加载的过程

34、可以描述一下 class 文件的结构吗?

35、说说 JVM 如何执行 class 中的字节码

36、生产环境 CPU 占用过高,你如何解决?

37、生产环境服务器变慢,如何诊断处理?

38、遇到过元空间、堆外内存溢出吗?


更多相关文章

  1. Object对象你真理解了吗?
  2. 内存溢出复现(OutOfMemory)
  3. Java 类的静态变量存放在哪块内存中?
  4. HotSpot VM 中对象的内存分析
  5. HotSpot 内存分配的主要规则
  6. 从对象生命周期的经验统计到垃圾回收算法
  7. 什么样的 Java 对象会被当垃圾回收?
  8. volatile如何避免指令重排序?原来使用了内存屏障

随机推荐

  1. 【重磅】Google或借道搜狗回归中国,明天见
  2. Core Java 并发:理解并发概念
  3. 5个有趣的程序员彩蛋
  4. 模块_Haskell笔记2
  5. Python&C++造就Google人工智能系统Tensor
  6. 大厂面试官竟然这么爱问Kafka,一连八个Kaf
  7. 1计算机网络【开山篇】
  8. 一场函数式思维模式的洗礼
  9. API注入机制及插件启动流程_VSCode插件开
  10. 使用Docker Compose部署SpringBoot应用