Java 垃圾回收面试题2025年3月17日 | 阅读 7 分钟 垃圾回收是 Java 中最重要的主题之一。垃圾回收允许程序执行自动内存管理。垃圾回收面试题通常由面试官提出。 1) 为什么 Java 需要垃圾回收?在 C 和 C++ 等编程语言中,开发人员以编程方式回收分配给内存中对象的空间。在 Java 编程中,用户不必负责管理对象使用的内存空间。在 JVM 中,垃圾回收例程作为其一部分添加,负责识别和删除内存中不再使用的对象。 2) 垃圾回收有什么缺点?垃圾回收的主要缺点是它会冻结在内存回收阶段发生时所有当前活动的线程。垃圾回收算法需要几秒钟或几分钟才能运行,因此,无法安排垃圾回收例程。 3) 解释 Java 堆的结构。共享所有线程的内存块称为 Java 堆。在 Java 中,堆由三个代组成:新生代、老年代和永久代(PermGen space)。要了解有关堆结构的更多信息,请访问以下链接 https://tpointtech.cn/java-heap 4) 解释 Java 中的永久代(PermGen space)。JVM 持有的 Java 类的内部表示包含在永久代(PermGen space)中。永久代(PermGen space)包含以与堆的其他部分(年轻代和老年代)收集相同方式收集的垃圾数据。要了解有关堆结构的更多信息,请访问以下链接 https://tpointtech.cn/permgen-space-java 5) 解释 Minor、Major 和 Full 垃圾回收之间的区别。没有官方文档或规范可以定义 Major、Minor 和 Full 垃圾回收之间的区别。我们可以如下定义它们中的每一个:
6) 如何在 Java 中识别 Major 和 Minor 垃圾回收?我们可以根据输出来识别 Major 和 Minor 垃圾回收。如果通过使用 -XX:PrintGCDetails 或 verbose:gc 启用了垃圾回收日志记录,Minor 集合会打印 "GC",而 Major 集合会打印 "Full GC"。 7) 区分 ParNew 和 DefNew 年轻代垃圾回收器。ParNew 和 DefNew 都是年轻代垃圾回收器。与并发标记清除(concurrent Mark Sweep)一起使用的多线程垃圾回收器称为 ParNew 年轻代垃圾回收器,而与串行垃圾回收器(serial garbage collector)一起使用的单线程垃圾回收器称为 DefNew 年轻代垃圾回收器。 8) 解释垃圾回收器中 Finalize() 方法的用途。在垃圾回收器收集任何可被垃圾回收的对象之前,会调用 Finalize() 方法。Finalize() 方法用于给对象最后一次机会进行清理和释放剩余资源。 9) 我们能否强制垃圾回收器随时运行?不,我们不能在 Java 中强制垃圾回收。但是,我们可以通过调用 system.gc() 或其类似方法 Runtime.getRuntime().gc() 来请求它。调用这些方法并不保证 GC 会立即运行。 10) JVM 中的永久代(permanent generation space)是否会发生垃圾回收?是的,永久代(PermGen space)会发生垃圾回收。如果永久代(PermGen)超过阈值或已满,则会触发 Full Garbage Collector。 11) Java 对象何时可供垃圾回收?当对象满足以下条件时,它就可以进行垃圾回收:
12) 什么是标记-清除(mark-and-sweep)?标记(Mark)和清除(Sweep)是垃圾回收的两个阶段。在标记阶段,JVM 识别对象是否仍然需要。当对象不需要时,它就会被标记为垃圾回收。 在清除阶段,JVM 执行内存回收和垃圾回收算法。 13) 解释 Minor、Major 和 Full 垃圾回收的区别。没有官方文档可以定义Minor、Major和Full垃圾回收之间的区别。然而,通常的理解是:
14) 什么是内存泄漏?它如何影响垃圾回收?垃圾回收器未能识别和删除内存中未使用的对象的情况称为内存泄漏。 内存泄漏会增加内存消耗。增加内存消耗后,JVM 会被迫为新对象腾出更多空间。垃圾回收的标记和清除阶段会更频繁地运行。每次运行这些阶段时,它都会释放更少的内存,直到堆空间耗尽。 15) 我们可以从代码中触发垃圾回收吗?是的,我们可以通过向 JVM 发出请求来触发垃圾回收。我们使用 System.gc() 命令发出请求。但是,JVM 何时会响应此类请求并不保证。 16) 内存的哪个部分(栈或堆)涉及 GC?内存的堆部分涉及 GC。 17) 解释 GC 的职责。垃圾回收的主要职责是释放未使用的内存。GC 确保可用内存得到有效利用,但不能保证有足够的内存来运行程序。 18) 什么是守护线程?GC 是守护线程吗?在应用程序后台运行以执行后台操作的线程称为守护线程。 是的,GC 是由 JVM 启动的守护线程。 19) 解释当对象不再需要时,使其可供 GC 的方法。有以下三种方法可以使对象可供 GC: 将所有可用对象引用设置为 null 当创建对象的目的实现后,我们可以将该对象的引用设置为 null,使其可供 GC。 通过使引用变量指向另一个对象 将引用变量与对象解耦,并将其设置为指向另一个对象,从而使它之前引用的对象在重新分配后可供垃圾回收。 通过创建隔离岛 当两个实例变量引用同一类的实例,并且这两个变量也互相引用,而这两个变量所引用的对象没有任何其他有效引用时,这两个对象就可以进行垃圾回收。 20) 垃圾回收的优点是什么?Java 中自动垃圾回收的主要优点是它消除了我们手动分配和释放内存的负担,因此我们可以专注于解决问题。 21) 重写 finalize() 方法的目的是什么?Java 中的 finalize() 方法也称为 finalizer,是 java.lang.Object 类中定义的一个方法。在垃圾回收器收集任何可供 GC 的对象之前,它会调用此方法。因此,finalize() 方法为对象提供了最后一次机会来执行清理并释放任何剩余资源。 22) 当对象不再需要时,使其可供 GC 的不同方法有哪些?
垃圾回收器对一个对象调用 finalize() 方法多少次?一次。 垃圾回收器是前台线程还是后台线程?垃圾回收器是后台守护线程。守护线程在 JVM 启动的应用程序后台运行。当所有非守护的前台线程停止时,守护线程也会停止。 78) 什么是垃圾回收时间?找到的活动对象越多,暂停时间就越长,这会直接影响响应时间和吞吐量。垃圾回收的这一基本原则及其对应用程序执行的影响称为垃圾回收暂停或 GC 暂停时间。 |
我们请求您订阅我们的新闻通讯以获取最新更新。