什么是优秀的Java编码实践来帮助Java GC?

时间:2013-01-18 16:57:13

标签: java garbage-collection

  

可能重复:
  How can I avoid garbage collection delays in Java games? (Best Practices)

Java的GC暂停是一个杀手。通常的时候,应用程序没有内存泄漏。在某些时候,每1G内存分配可能会暂停约1秒。

有哪些优秀的Java编码实践可以帮助Java GC?

一个例子,因为null对象有资格进行垃圾收集,所以最好将对象显式设置为null,例如object = null。

3 个答案:

答案 0 :(得分:3)

最大限度地减少GC暂停的最佳方法是正确调整堆的大小。

如果你知道你的程序从不使用超过1Gb的活动对象,那么传递-Xms4096m毫无意义。这实际上会增加你的GC暂停,因为JVM会留下垃圾,直到绝对必须清除它。

同样地,如果您知道长期存在的对象非常少,那么通过增加年轻代相对于终身代(Sun JVM)的大小,通常可以获益。

你唯一可以做的,编码方式是将大型对象移出堆外。但这对大多数应用程序来说不太可能有用。

答案 1 :(得分:2)

一般来说,为了帮助GC,你应该避免不合理的内存使用。简单的建议可能是:

1)不要在不需要的地方生产新物品。例如,不要使用String test = new String("blabla");之类的结构。如果可能的话,重用旧对象(它主要属于不可变对象)。

2)不要在类中声明字段,它们仅在方法内部使用;即使它们成为局部变量。

3)避免在原始类型下使用对象包装器。即如果您确实不需要存储int值,请使用Integer代替booleanBoolean代替null。另外,例如,在内存经济可行的情况下,不要使用ArrayList,使用原始类型的简单Java arrays(不是Integer[],而是int[])。< / p>

答案 2 :(得分:0)

分配但未立即释放的对象将被移动到tenured heap space中。终身记忆是最昂贵的收集。避免通过长寿命物体搅拌应该有助于GC暂停。