在java中调用System.gc()是否建议终生代和年轻代的垃圾收集?

时间:2010-05-20 08:10:59

标签: java garbage-collection

在java中调用System.gc()(通过JMX)时,它将尽职尽责地(尝试)清理年轻一代。这通常很有效。但我从未见过它试图清理终身一代。这引出了两个问题:

  1. 可以甚至可以收集终身代(即,这一代实际上是垃圾,还是终身代中的所有对象实际上仍然有对它们的实时引用)?
  2. 如果可以收集终身代,可以通过System.gc()来完成,还是有其他办法(不太可能),或者我只需要等到我在终身一代用完了空间?

4 个答案:

答案 0 :(得分:4)

http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#other_considerations声明System.gc()会触发major集合,即包括终身合作。

您是否在GC日志中看到过这种情况?

答案 1 :(得分:3)

关于Java垃圾收集的特别文章:Tuning Garbage Collection with the Java 5 VM它专门针对Java 5,但大多数可能仍适用于以后的VM。

答案 2 :(得分:2)

我不同意见。 Java 6 GC调优指南实际上是这样说的:

  

可以迫使主要收藏品在没有必要时(即小型收藏品足够时)完成,因此通常应该避免。

请注意使用“can”而不是“will”。我对这句话的解读是,它没有说明将要完成一个主要的收藏。它可能会完成,也可能不会。我认为作者真正想在这里(和其他地方)做的一点是,调用System.gc()可能会导致收集器做很多不必要的工作。

现在可能是调用System.gc() 每次都会导致一个主要的集合...对于某个版本的JVM。但是你不应该依赖于所有版本的情况,特别是未来版本。

答案 3 :(得分:-2)

java中垃圾收集的简单拇指规则是,

  • 使用内存清理技术,例如在不需要时清理资源,成员和实例。
  • 关闭你打开的内容。 (W.R.T.连接,休眠会话等......)
  • 使用文件IO时使用缓冲技术。
  • 使用新的NIO而不是旧的文件IO。
  • 使用java utils中的Collections类进行集合操作。
  • 尽可能使用数组。
  • 学习特定于框架的技术。在休眠中说,不要将ArrayList用于一对多关系,因为列表是有序的,因此它会为子项的排序添加额外的列。请改用Set

  • 不要使用Hsql。使用某种关系数据库,如postgres等...... HSQL会占用更多内存。我遇到了与此有关的问题。

  • 还要记住,当您使用XML处理时,如果您只想从XML读取少量数据,请不要使用DOM。 DOM将在内存中构建XML的整体结构,因此将占用更多内存。

  • 尽量不要将对象保留在内存中,这些对象会随着时间的推移而增长。否则应用程序可能会内存不足。

  • 定义列表,地图等的尺寸......

  • 不要使用任何框架来满足小需求。如果是这样,那么请仔细检查如何调整配置以获得更好和更小的堆区域。

只是打电话给System.gc(),不要释放你的记忆并清理物品。

伙计们,如果我错过了,请添加更多细节。所以其他人可以检查一下以获得更好的性能。 感谢。