我有一个 Java 客户端,它消耗来自服务器的大量数据。如果客户端没有以足够快的速度跟上数据流,则服务器断开套接字连接。我的客户每天断开连接几次。我运行 jconsole 来查看内存使用情况,堆空间图看起来像一个定义相当明确的锯齿模式,在大约 0.5GB 和 1.8GB 之间振荡(分配了 2GB 堆空间)。但是每次我断开连接都是在一个完整的 GC 期间(但不是在每个完整的 GC 上)。我看到完整的 GC 平均需要 1 秒多一点。根据一天中的时间,Full GC 在忙碌时每 5 分钟发生一次,或者在慢速期间 Full GC 之间最多可以间隔 30 分钟。
我怀疑如果我可以减少完整的 GC 时间,客户端将能够更好地跟上传入的数据,但我对 GC 调优没有太多经验。有没有人知道这是否是一个好主意,以及如何去做?或者是否有另一种想法也可以奏效?
** 更新 ** 我使用了 -XX:+UseConcMarkSweepGC 并且它有所改进,但在非常忙碌的时候我仍然断开连接。所以我将堆分配增加到 3GB 以帮助度过忙碌的时刻,现在它似乎运行得很好,但只有 1 天没有断开连接。也许如果我有时间,我会尝试减少产生的垃圾量,我相信这也会有所帮助。感谢所有的建议。