Java垃圾收集

Nag*_*ran 36 java garbage-collection

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

Ste*_*n C 43

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

我们不需要它们.事实上,在大多数情况下,调用System.gc()有害的应用程序的性能.有关详细解释,请参阅我的回答"为什么调用system gc是一个不好的做法".

什么时候应该使用System.gc()

如果应用程序知道它将进入一个没有其他任何操作的阶段并且用户不太可能注意到垃圾收集,那么也许可以调用以System.gc()努力阻止用户在将来遇到GC暂停.

缺点包括:

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

(System.gc()在单元测试和系统调试期间调用也可能是合理的原因.)


Tim*_*der 16

没有必要显式调用垃圾收集,调用System.gc()只是一个建议,JVM可以忽略你的建议.

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

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

  • 在观察应用程序的堆时,人们通常会看到锯齿状的外观,其中已用堆大小在每次 GC 后恢复到大致相同的大小。保留大量数据(有点内存泄漏)的应用程序往往会继续增加堆。 (2认同)