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

有哪些好的Java编码实践可以帮助Java GC?,java,garbage-collection,Java,Garbage Collection,可能重复: Java的GC暂停是一个杀手。通常情况下,应用程序没有内存泄漏。在某些情况下,每分配1G内存,它可能会暂停约1秒 有哪些好的Java编码实践可以帮助Java GC 例如,由于null对象符合垃圾收集的条件,因此最好将对象显式设置为null,例如object=null 要最小化GC暂停,最好的办法是适当调整堆的大小 如果您知道您的程序从未使用超过1Gb的活动对象,那么传递-Xms4096m是毫无意义的。这实际上会增加GC暂停,因为JVM会留下垃圾,直到它必须清除为止 类似地,如果您知

可能重复:

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

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


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

要最小化GC暂停,最好的办法是适当调整堆的大小

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

类似地,如果您知道只有很少的长寿对象,通常可以通过增加年轻一代相对于终身一代的大小(对于Sun JVM)来获益


在编码方面,您真正可以做的唯一事情是将大型对象移出堆。但是对于大多数应用程序来说,这不太可能有用。

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

1) 不要在不需要的地方生成新对象。例如,不要使用类似
stringtest=newstring(“blabla”)的结构。如果可能,重用旧对象(它主要属于不可变对象)

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


3) 避免在基元类型下使用对象包装器。也就是说,如果确实不需要在它们中存储
null
值,请使用
int
而不是
Integer
boolean
而不是
boolean
。另外,例如,在可能的情况下,为了节省内存,不要使用
ArrayList
,而是使用原语类型的简单Java
arrays
(不是
Integer[]
,而是
int[]
)。

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

“空对象”?我不认为这是一件事…@HighCore你意识到C#也是一种垃圾收集语言,对吗?一种方法是避免不必要的垃圾:避免动态创建对象并使用可重用对象池。我的意思是设置一个对象null以帮助GC收集它。例如,应用程序为用户请求创建上下文对象(Tomcat/JBoss)。如果将context object设置为null,是否有助于Java GC并提高其效率?@HighCore我从来没有遇到过Java垃圾收集或C#垃圾收集的问题。我把那些有问题的人的抱怨视为他们自己内存管理不善的问题……也可以请求垃圾收集系统.gc()或类似的东西。当你知道你的程序不会特别忙时,你可以这样做。是的,这很好。还有什么?我能想到的另一件事是使用StringBuilder.append()而不是字符串连接,以避免创建不必要的对象。字符串连接使用StringBuilder.append()。用javap-c反汇编一些代码,自己看看。@DavidConrad真的吗?嗯,在JSL7中说,当你连接两个字符串时,你会产生一个新的
String
对象。@Andremoniy是的,当你连接两个字符串时,你会产生一个新的String对象。通过构造StringBuilder,使用每个字符串调用其append方法,然后调用其toString方法来获取结果字符串。正如我所说,编写一个简单的程序,编译它,然后用
javap-c
反汇编它,你会看到,即使你在源代码中没有提到StringBuilder,java编译器仍然会发出使用StringBuilder连接字符串的代码。明白了吗。作为JBoss web应用程序,我们不能独裁者用户的行为。请求的大小可能很大,也可能更快。下面是一个真实的例子()