Java 垃圾回收

2022-09-01 04:22:53

Java会自动调用垃圾回收器,那么为什么我们需要手动调用垃圾回收呢?何时应使用 System.gc()


答案 1

Java会自动调用垃圾回收器,那么为什么我们需要手动调用垃圾回收呢?

我们不需要它们。实际上,在大多数情况下,调用对应用程序性能有害。请参阅我对“为什么调用系统gc是一种不好的做法”的回答,以获取详细的解释。System.gc()

何时应使用 System.gc()

如果应用程序知道它正在进入一个阶段,在这个阶段中,它没有其他事情可做,并且用户不太可能注意到垃圾回收,那么也许可以调用它来阻止用户将来遇到GC暂停。System.gc()

缺点包括:

  • 调用通常会触发一个完整的GC,这比“新空间”的GC花费的时间要长得多。System.gc()
  • 用户实际上可能关心/注意到。例如,如果您在游戏中的“关卡”之间进行调用,则会使加载下一个关卡花费更长的时间。System.gc()
  • 通过强制GC,您会导致JVM使用额外的CPU周期等,这可能会干扰用户在其机器上正在执行的其他操作。

(在单元测试和系统调试期间调用也可能有正当理由。System.gc()


答案 2

不需要显式调用垃圾回收,调用只是一个建议,JVM可以忽略您的建议。System.gc()

我能想到的唯一实际用途是

  1. 在调试期间,强制集合可能会暴露内存泄漏
  2. 如果程序经历可预测的密集计算周期,然后没有计算(如回合制游戏),在无计算期间,CPU可用于建议的垃圾回收,以防止在密集计算部分出现抖动。