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

时间:2012-03-02 03:15:51

标签: java garbage-collection

  

可能重复:
  Forcing Garbage Collection in Java?

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

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

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

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

当有大量资源无法重复使用时,这确实会影响性能。我们所能做的就是睡眠()。

任何解决方案?谢谢

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:5)

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

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

一些常见的罪魁祸首:

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

答案 2 :(得分:1)

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

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

  1. 正如您所说,尝试"建议"那个GC现在是一个叫做System.gc()的好时光。
  2. 将您未使用的任何引用设置为空引用,以使元素符合收集条件。
  3. 关于我的第二点,请在此处查看答案:Garbage collector in java - set an object null。实质上,如果你没有制作你不需要进行垃圾收集的对象(通过丢失你必须使用的引用)那么垃圾收集器没有理由运行,因为它&#39 ; s不知道任何可用的垃圾。

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

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