oracle面试jvm,这波 JVM 面试题解答,绝对给你面试加分

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

自己把握不准的,写出来就是误导别人,所以宁缺毋滥。之前那 32 道 《MyBatis技术内幕》两本书,总结的答案。可能没那么精炼,也存在笔误,但绝对经得住你的质疑。

19fa1fc9c37caec008eec98b8646a03a.png

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 8The 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、遇到过元空间、堆外内存溢出吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值