【问题标题】:Can I suggest JVM when to do the garbage collection?我可以建议 JVM 何时进行垃圾收集吗?
【发布时间】:2019-02-25 06:40:02
【问题描述】:

我在我的 java 代码中使用了一个基于事件的框架,当没有其他事件发生时会触发一个事件,假设它是一个线程空闲事件。我觉得现在是做 GC 的好时机,因为此时做 GC 不会对其他工作产生影响。

所以:1,我有什么办法可以做到这一点? 2、我应该这样做吗?

【问题讨论】:

  • 您可以调用System.gc(),这建议,但不保证JVM 会运行垃圾收集器。然而,大多数时候 JVM 非常聪明地知道什么是运行垃圾收集器的最佳时间。

标签: java garbage-collection jvm


【解决方案1】:

回答您的问题:

您可以告诉 JVM 启动垃圾收集,但 JVM 将决定是否以及何时进行垃圾收集。不再使用的对象,将自动进行垃圾收集。如果你真的想建议 JVM 运行垃圾收集,你应该使用这行代码:

System.gc();

但正如我所说,JVM 会看到它什么时候不再被使用,它会在它想要/需要的时候进行垃圾收集。

【讨论】:

  • 然而这并没有触发垃圾收集,它只是提示JVM应该运行GC,但是你没有办法强制它这样做。
【解决方案2】:

1) System.gc()

2) 我应该这样做吗?

万恶之源是过早优化

我怀疑它会有所帮助,而且它很有可能会降低性能。你想优化什么?吞吐量还是延迟?你如何测量它?这真的很难,就像 gc 你应该模拟一个类似生产的环境。 System.gc() 会执行一次完整的 gc,因此它可能会引入长时间的停顿,而年轻代的短停顿是可以接受的。

请注意,G1 垃圾收集器已经根据系统负载自动调整自身。

【讨论】:

  • 这部分引述是恰当的,但 D.E. Knuth 实际上说: 1. '真正的问题是程序员在错误的地方和错误的时间花费了太多时间来担心效率;过早优化是编程中万恶之源(或至少是大部分)。'
  • 另一个版本:2. '程序员浪费大量时间去思考或担心他们程序的非关键部分的速度,而这些效率上的尝试实际上在调试和调试时产生了强烈的负面影响。考虑维护。我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。 '
猜你喜欢
  • 2012-06-15
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多