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

Jac*_*cob 9 java garbage-collection

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

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

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

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

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

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

任何解决方案?谢谢

Mic*_*ael 12

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

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

  • +1"GC很聪明".(它非常聪明,而且很少是性能瓶颈的真正原因.) (5认同)

mik*_*era 5

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

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

一些常见的罪魁祸首:

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

  • 强制执行 GC 是有原因的。最明显的是,如果您要输入一段与现实世界交互的延迟敏感的代码,并且希望最大限度地减少 GC 因“大”集合而暂停的机会。当然,如果延迟确实很重要,那么 Java 不太可能是解决该问题的最佳语言,但有时您会遇到这种错误无法挽回的情况。 (2认同)