为了账号安全,请及时绑定邮箱和手机立即绑定

Java面试题:垃圾回收机制详解

标签:
Java 面试 JVM
垃圾收集:

Java垃圾回收是Java程序自动管理内存的过程。

Java程序会被编译成字节码,可以在Java虚拟机(简称JVM)上执行。在JVM上运行的Java程序中,对象会在堆中创建,堆是专门用于程序对象的内存区域。

到最后,一些对象将不再被需要。垃圾收集器找到这些不再使用的对象然后删除它们,从而释放内存空间。

让对象可以被垃圾回收的方法
  • 即使程序员不需要负责销毁无用的对象,但强烈建议这样做,在不再需要某个对象时使其不可达(从而可以被垃圾回收)。
  • 通常有四种方法可以让对象可以被垃圾回收。

1.将引用变量设置为 null:将引用变量设置为 null,如果没有其他引用指向该对象,该对象将可以被垃圾回收器回收。

2. 重新分配引用变量的指向:改变现有引用变量所指向的对象,使之在没有其他引用指向它时,成为垃圾回收的候选对象。

3. 在方法内部创建的对象:在方法内部创建的对象,一旦方法结束且不再有引用指向它,就可以被垃圾回收机制回收。

4. 孤立的岛屿:当一个对象无法从任何活的线程或静态引用中触及或到达时,它就变得孤立无援,并就可以被垃圾回收机制回收。

孤岛的例子

触发JVM垃圾收集的方法

在 Java 中,让一个对象成为垃圾回收的对象候选并不能保证它会被立即回收。JVM 会根据需要运行垃圾回收器。你可以通过以下方式来请求垃圾回收。

  1. **System.gc()**:系统类中的一个静态方法,用于垃圾回收。
  2. **Runtime.getRuntime().gc()**:运行时对象中的一个方法,用于垃圾回收。

然而,这两种都无法保证垃圾收集器真的会启动。

最终步骤 :
垃圾收集器在回收对象之前通常会调用 finalize() 方法:

在销毁一个对象之前,垃圾回收器会调用该对象的 finalize() 方法来进行清理工作。这个方法在 Object 类中定义,其原型为 protected void finalize() throws Throwable,可以被重写以管理资源,比如关闭与数据库的连接。

关于 finalize() 的一些要点:

  • 它由垃圾回收器负责,垃圾回收器是JVM的一部分。
  • 默认实现为空,因此建议重写它以进行清理。
  • 对象的 finalize() 方法永远不会被调用超过一次。
  • 如果在 finalize() 中发生未捕获的异常,该异常将被忽略,对象的终结过程结束。
垃圾收集器的种类:

顺序垃圾收集器(garbage collector)

  • 使用单线程收集;非常适合内存需求低的小型应用。

并行垃圾回收器

  • 使用多个线程来处理小集合;最适合需要高吞吐量的应用,例如,这类应用可能包括某些数据库操作或并发任务处理。

并发标记-清除(CMS)收集器

  • 减少暂停时间,与应用线程并行运行;非常适合低延迟的应用场景。

G1 (G1垃圾收集器):

  • 将内存堆分成多个区域,优先处理垃圾最多的部分;适用于需要预测暂停时间的大应用。
问题:
什么是Mark-and-sweep?

MarkSweep 是垃圾收集的两个阶段。在 Mark 阶段,JVM 会识别对象是否仍被引用。不再被引用的对象将被标记以进行 GC。

Sweep(清理)阶段,JVM进行垃圾回收算法。

不同时代线程是什么?垃圾回收器是后台线程吗?

在应用程序中运行的后台线程称为守护(daemon)线程。

没错,GC 是由 JVM 启动的一个后台线程。

垃圾收集器对一个对象调用了 finalize() 方法多少次?

就一次。

代码里能不能触发垃圾收集?

我们可以通过调用 system.gc,不过不能保证它一定会被调用。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消