我怀疑如果我能减少完整GC的时间,客户端就可以更好地跟上传入的数据,但我对GC调优没有太多经验。是否有人对此有一些见解,并知道如何做到这一点?还是有其他替代方案也可以起到同样的作用?
** 更新 ** 我使用了-XX:+UseConcMarkSweepGC并且有所改善,但在非常繁忙的时候仍然会断开连接。因此,我将堆分配增加到3GB,以帮助度过繁忙的时刻,现在它似乎运行得很顺畅,但只有1天没有断开连接。也许如果我有时间,我会尝试减少创建的垃圾数量,我相信这也会有所帮助。感谢所有的建议。
我怀疑如果我能减少完整GC的时间,客户端就可以更好地跟上传入的数据,但我对GC调优没有太多经验。是否有人对此有一些见解,并知道如何做到这一点?还是有其他替代方案也可以起到同样的作用?
** 更新 ** 我使用了-XX:+UseConcMarkSweepGC并且有所改善,但在非常繁忙的时候仍然会断开连接。因此,我将堆分配增加到3GB,以帮助度过繁忙的时刻,现在它似乎运行得很顺畅,但只有1天没有断开连接。也许如果我有时间,我会尝试减少创建的垃圾数量,我相信这也会有所帮助。感谢所有的建议。
Full GC可能需要很长时间才能完成,而且不容易进行调整。
简单的一种调整方式是增加堆空间 - 一般来说,将堆空间加倍可以将两次GC之间的间隔加倍,但会使GC所需的时间增加一倍。如果您运行的程序具有非常清晰的使用模式,也许可以考虑增加堆空间,使间隔变得如此之大,以至于您可以保证有一些空闲时间来尝试让系统执行GC。另一方面,按照这种逻辑,如果堆很小,完全垃圾收集将在瞬间完成,但那似乎比帮助更多地邀请麻烦。
此外,-XX:+UseConcMarkSweepGC
可能会有所帮助,因为它将尝试同时执行GC操作(不停止您的程序;详见此处)。
这里有一篇由Til Gene发表的非常好的演讲(Azul Systems的CTO,高性能JVM制造商,并发表了几个GC算法),介绍了JVM中的GC。
避免调用Runtime.getRuntime().gc() - 当手动触发垃圾收集时,它要么什么也不做,要么会执行全停顿垃圾收集。您应该使用增量垃圾收集。
您尝试过使用jdk安装的服务器jvm吗?它会更改一堆默认配置设置(包括垃圾收集),而且很容易尝试 - 只需在java命令中添加-server。
java -server
都是些什么垃圾被创建出来了?能否减少它的生成量呢?在可能的情况下,尽量使用valueOf方法。通过使用更少的内存,您将节省自己在垃圾回收和内存分配方面的时间。