我可以用Java强制垃圾收集吗?

可能重复:
在Java中强制垃圾收集?

我可以用Java强制垃圾收集吗?

System.gc()只是一个建议。它没用。

当我确定不再使用某些资源时,为什么我不能强行清理它们呢?

就像C ++中的delete()和C中的free()一样?

当有很多资源无法重用时,这可能真的很糟糕。我们所能做的就是sleep()。

任何解决方案?谢谢

不,System.gc()尽可能接近。 Java不是C或C ++,JVM为您管理内存,因此您没有那种细粒度的控件。 如果您将不再使用的对象设置为null或松散所有引用,它们将被清除。 GC很聪明,所以应该好好照顾你。

也就是说,如果你在一个unix盒子上,并强制进行线程转储(kill -3),它​​将非常强制垃圾收集。

不应该试图强制GC – 如果你的内存不足,那么你的内存就会泄漏。 在此时强制GC将无济于事,因为如果您持有对象的引用,那么它仍然不会被垃圾回收。

你需要做的是解决真正的问题,并确保你没有持有对你不再使用的对象的引用。

一些常见的罪魁祸首:

  • 在一个永远不会被清理的大对象图中保存大量引用。 当您不再需要它们时,可以将引用设置为null,或者更好地简化对象图,这样就不需要所有额外的长期引用。
  • 在哈希映射中缓存对象或类似的随着时间的推移而变大的对象。 停止这样做,或者使用像Google的CacheBuilder这样的东西来创建一个合适的软参考缓存。
  • 随着时间的推移过度使用String.intern()对大量不同的字符串。
  • 范围大于他们需要的参考文献。 例如,当它可能是局部变量时,您是否正在使用实例变量?

没有办法明确指示JVM收集垃圾。 仅在系统需要资源时执行此操作。

我知道可能让GC运行的两个动作如下:

  1. 正如你所说的那样,试着通过调用System.gc()来“建议”GC现在是个好时机。
  2. 将您未使用的任何引用设置为空引用,以使元素符合收集条件。

在我的第二点,请看这里的答案: java中的垃圾收集器 – 将对象设置为null 。 从本质上讲,如果你没有制作你不需要垃圾收集的对象(通过丢失你必须的引用),那么垃圾收集器没有理由运行,因为它不知道任何可用的垃圾。

此外,重要的是要考虑内存中的对象为何/如何影响性能:

  • 你有很多OutOfMemoryExceptions吗? 这可以通过#2点和增加JVM的可用堆空间来解决。
  • 您是否已完成测量以查看JVM分配的堆空间中的更多对象是否会影响性能? 确定何时可以提前引用对象可以帮助减少这些问题。