JVM 面试题

发布于:2024-04-26 ⋅ 阅读:(23) ⋅ 点赞:(0)

1. 什么情况下会发生栈内存溢出?

当线程调用堆栈深度超过虚拟机所允许的最大深度时,会抛出StackOverflowError。如果一个线程请求的栈深度超过了虚拟机的允许范围,会抛出OutOfMemoryError

2. 说一下 JVM 的主要组成部分及其作用?

  • 类加载器(ClassLoader) 负责加载字节码文件
  • 运行时数据区(Runtime Data Areas) 存储程序运行时的数据
  • 执行引擎(Execution Engine) 执行字节码指令
  • 本地方法库(Native Interface) 供与本地系统交互的接口

3. 详解 JVM 内存模型

JVM内存模型规定了程序在JVM上运行时,各种数据的存储方式和访问规则。主要分为堆、栈、方法区、程序计数器和本地方法栈。

4. 说一下 JVM 运行时数据区

JVM运行时数据区包括:堆、栈、方法区、程序计数器和本地方法栈。

5. JVM 内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为 Eden 和 Survivor。

为了更高效地管理内存和垃圾回收,JVM将堆内存分为新生代和老年代。
新生代用于存放新对象,老年代用于存放长期存活的对象。
新生代分为Eden区和两个Survivor区,以实现对象的快速分配和回收。

6. 深拷贝和浅拷贝

深拷贝会创建对象的副本,包括对象引用的所有对象,而浅拷贝只复制对象的引用。

7. 为什么要分为 Eden 和 Survivor?为什么要设置两个 Survivor 区?

为了提高垃圾回收的效率,Eden区用于对象的分配,Survivor区用于存放经过一次垃圾回收后仍然存活的对象。两个Survivor区可以减少内存的浪费,并提高对象间移动的效率。

8. 说一下堆栈的区别?

堆用于存储对象实例,栈用于存储局部变量和方法调用的相关信息。

9. 你知道哪几种垃圾收集器,各自的优缺点,重点讲下 cms 和 G1,包括原理,流程,优缺点。

CMS(Concurrent Mark Sweep)和G1(Garbage-First)是两种常见的垃圾收集器。

  • CMS通过并发标记和清除来减少GC停顿时间,但可能导致较多的内存碎片。
  • G1通过将堆分割成多个区域,并对这些区域进行优先级排序来收集,从而减少GC的停顿时间,但可能会增加CPU的使用率。

10. 队列和栈是什么?有什么区别?

队列是一种先进先出(FIFO)的数据结构,栈是一种后进先出(LIFO)的数据结构。

11. HotSpot 虚拟机对象探秘

HotSpot虚拟机是Oracle公司开发的一种JVM实现,它通过多种优化技术提高Java程序的性能。

12. JVM 内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存。

JMM(Java内存模型)定义了Java程序中各种变量的访问规则,包括原子性、可见性和有序性。重排序是编译器或处理器对指令序列进行重新排序以优化性能,内存屏障用于控制内存操作的执行顺序,happen-before是JMM定义的两个操作之间的因果关系。

13. 对象的创建

对象的创建包括类加载、分配内存、初始化和设置对象头等步骤。

14. 简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。

类加载器负责加载类文件,双亲委派模型是一种类加载器的查找机制,可以防止重复加载。打破双亲委派模型可以通过自定义类加载器,不调用loadClass方法,而是使用findClass方法加载类。

15. 为对象分配内存

对象的内存分配包括选择空间(Eden区或Survivor区)、分配方式(指针碰撞或空闲列表)和并发情况下的处理。

16. 什么是类加载器?

类加载器负责加载Java字节码文件,将其转换为JVM可以理解的Class对象。

17. 处理并发安全问题

并发安全问题可以通过锁、同步代码块、原子变量等方式来处理。

18. 为什么需要双亲委派模型?

双亲委派模型保证了Java核心库的类型安全,防止核心库的类被篡改。

19. 对象的访问定位

对象的访问定位包括使用句柄访问和直接指针访问。

20. 说说你知道的几种主要的 JVM 参数

JVM参数包括堆大小参数(-Xms, -Xmx)、垃圾收集器参数(-XX:+UseG1GC)、类加载器参数(-Djava.ext.dirs)等。

21. 句柄访问

句柄访问是一种对象访问方式,通过句柄池间接访问对象。

22. 怎么打破双亲委派模型?

通过自定义类加载器,重写loadClass方法,不调用父加载器的loadClass方法。

23. 直接指针

直接指针是一种对象访问方式,直接存储对象的内存地址。

24. 内存溢出异常

当JVM的堆内存或栈内存不足时,会抛出内存溢出异常。

25. 怎么打出线程栈信息

可以使用ThreadDump工具或通过JVM提供的jstack命令来获取线程栈信息。

26. Java 会存在内存泄漏吗?请简单描述

Java中存在内存泄漏,当对象不再被使用,但仍然被其他对象引用时,就会造成内存泄漏。

27. 垃圾收集器

垃圾收集器负责回收不再使用的对象,释放内存。

28. 垃圾收集器与内存分配策略

垃圾收集器的效率与内存分配策略密切相关,如对象优先在Eden区分配,大对象直接进入老年代等。

29. 简述 Java 垃圾回收机制

Java垃圾回收机制通过自动回收不再使用的对象来管理内存。

30. GC 是什么?为什么要 GC

GC(Garbage Collection)是垃圾收集的缩写,目的是自动管理内存,防止内存泄漏。

31. 虚拟机性能监控与故障处理工具

常用的JVM监控工具有JConsole、VisualVM,故障处理工具有jstack、jmap等。

32. 垃圾回收的优点和原理。并考虑 2 种回收机制

垃圾回收的优点是自动管理内存,原理是标记无用对象并回收。两种常见的回收机制是标记-清除和复制算法。

33. 垃圾回收器的基本原理是什么?

垃圾回收器的基本原理是标记无用对象并进行回收。

34. Java 中都有哪些引用类型?

Java中有强引用、软引用、弱引用和虚引用四种引用类型。

35. 怎么判断对象是否可以被回收?

当对象没有任何引用指向它时,对象可以被垃圾回收。

36. 垃圾回收器可以马上回收内存吗?

垃圾回收器不能立即回收内存,需要在下一次垃圾回收周期时进行回收。

37. 有什么办法主动通知虚拟机进行垃圾回收?

可以通过调用System.gc()方法来建议JVM进行垃圾回收。

38. 在 Java 中,对象什么时候可以被垃圾回收

当对象没有任何引用指向它时,对象可以被垃圾回收。

39. JVM 中的永久代中会发生垃圾回收吗

永久代(PermGen)也会进行垃圾回收,主要回收不再使用的类和常量。

40. 说一下 JVM 有哪些垃圾回收算法?

JVM中的垃圾回收算法包括标记-清除、复制、标记-整理和分代收集算法。

41. 标记-清除算法标记无用对象,然后进行清除回收。

标记-清除算法首先标记所有需要回收的对象,然后清除这些对象。

42. 复制算法

复制算法将内存分为两个区域,每次只使用一个区域,当一个区域满了后,将存活的对象复制到另一个区域。

43. 标记-整理算法

标记-整理算法首先标记所有需要回收的对象,然后整理存活的对象,使其紧凑排列。

44. 分代收集算法

分代收集算法将对象分为新生代和老年代,对不同年代的对象使用不同的回收策略。

45. 虚拟机类加载机制

虚拟机类加载机制包括加载、验证、准备、解析和初始化五个阶段。

46. 说一下 JVM 有哪些垃圾回收器?

JVM中的垃圾回收器包括Serial、ParNew、CMS、G1等。

47. 详细介绍一下 CMS 垃圾回收器?

CMS垃圾回收器是一种以减少GC停顿时间为目标的垃圾回收器,采用并发标记和清除算法。

48. 虚拟机字节码执行引擎

虚拟机字节码执行引擎负责执行字节码指令,包括解释执行和即时编译(JIT)两种方式。

49. 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?

新生代垃圾回收器主要有Serial、ParNew,老年代垃圾回收器主要有CMS、G1。新生代垃圾回收器主要针对新生代的回收,老年代垃圾回收器针对老年代的回收。

50. 类加载及执行子系统的案例与实战

类加载及执行子系统的案例与实战包括类加载器的选择、类加载过程的优化、字节码执行引擎的调优等。

60. 简述分代垃圾回收器是怎么工作的?

分代垃圾回收器将对象分为新生代和老年代,对不同年代的对象采用不同的回收策略。

61. 线程安全与锁优化

线程安全与锁优化包括使用锁来保证线程安全,以及通过锁优化来提高性能。

62. 内存分配策略

内存分配策略包括对象优先在Eden区分配、大对象直接进入老年代等。

63. 大对象直接进入老年代

大对象由于其大小超过了新生代的容纳能力,会直接在老年代分配。

64. 对象优先在 Eden 区分配

为了提高垃圾回收的效率,新对象优先在Eden区分配。

65. 虚拟机类加载机制

虚拟机类加载机制包括加载、验证、准备、解析和初始化五个阶段。

66. 描述一下 JVM 加载 Class 文件的原理机制

JVM加载Class文件的原理机制是使用类加载器按照全限定名加载Class文件,然后进行验证、准备、解析和初始化。

67. 长期存活对象将进入老年代

长期存活的对象会被移动到老年代进行存储。

68. 简述 java 内存分配与回收策率以及 Minor GC 和 Major GC

Java内存分配策略包括对象优先在Eden区分配,大对象直接进入老年代。Minor GC是新生代的垃圾回收,Major GC是老年代的垃圾回收。

69. 简述 java 类加载机制?

Java类加载机制包括加载、验证、准备、解析和初始化五个阶段。

70. 说一下类装载的执行过程?

类装载的执行过程包括加载Class文件、连接(验证、准备、解析)、初始化。

71. 什么是类加载器,类加载器有哪些?

类加载器负责加载Class文件,主要有Bootstrap ClassLoaderExtension ClassLoader和Application ClassLoader

72. JVM 调优

JVM调优包括内存调优、垃圾收集器调优、类加载调优等。

73. 什么是双亲委派模型?

双亲委派模型是一种类加载器的查找机制,子加载器在加载类之前会委托父加载器进行查找。

74. 常用的 JVM 调优的参数都有哪些?

JVM调优参数包括堆大小参数、垃圾收集器参数、JIT编译参数等。

75. 说一下 JVM 调优的工具?

JVM调优工具包括JConsole、VisualVM、jstack、jmap等。


网站公告

今日签到

点亮在社区的每一天
去签到