在java中调用System.gc()
(通过JMX)时,它将尽职尽责地(尝试)清理年轻一代。这通常很有效。但我从未见过它试图清理终身一代。这引出了两个问题:
答案 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中垃圾收集的简单拇指规则是,
Collections
类进行集合操作。学习特定于框架的技术。在休眠中说,不要将ArrayList
用于一对多关系,因为列表是有序的,因此它会为子项的排序添加额外的列。请改用Set
。
不要使用Hsql。使用某种关系数据库,如postgres等...... HSQL会占用更多内存。我遇到了与此有关的问题。
还要记住,当您使用XML处理时,如果您只想从XML读取少量数据,请不要使用DOM。 DOM将在内存中构建XML的整体结构,因此将占用更多内存。
尽量不要将对象保留在内存中,这些对象会随着时间的推移而增长。否则应用程序可能会内存不足。
定义列表,地图等的尺寸......
不要使用任何框架来满足小需求。如果是这样,那么请仔细检查如何调整配置以获得更好和更小的堆区域。
只是打电话给System.gc()
,不要释放你的记忆并清理物品。
伙计们,如果我错过了,请添加更多细节。所以其他人可以检查一下以获得更好的性能。 感谢。