2

可能重复:
如何避免 Java 游戏中的垃圾收集延迟?(最佳实践)

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

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

例如,由于 null 对象符合垃圾回收条件,因此最好将对象显式设置为 null,例如 object = null。

4

3 回答 3

4

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

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

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

3) 避免在原始类型下使用对象包装器。即使用int而不是Integerboolean而不是Boolean,如果你真的不需要在其中存储null值。还例如,在可能的情况下,为了节省内存,不要使用ArrayList,使用原始类型的简单 Java arrays(不是Integer[],但是int[])。

于 2013-01-18T17:06:18.813 回答
3

最大程度地减少 GC 暂停可以做的最好的事情就是适当地调整堆大小。

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

类似地,如果您知道您的长寿命对象非常少,您通常可以通过增加相对于老一代(对于 Sun JVM)的年轻代的大小而受益。

就编码而言,您真正能做的唯一一件事就是将大对象移出堆外。但这不太可能对大多数应用程序有用。

于 2013-01-18T17:02:17.923 回答
0

已分配但未立即释放的对象将移动到永久堆空间中。永久内存是最昂贵的收集。避免搅动长期存在的对象应该有助于 GC 暂停。

于 2013-01-18T17:06:26.663 回答