java full gc 花费的时间太长

标签 java performance garbage-collection

我有一个 Java 客户端,它使用来自服务器的大量数据。如果客户端没有以足够快的速度跟上数据流,服务器将断开套接字连接。我的客户每天断开连接几次。我运行 jconsole 查看内存使用情况,堆空间图看起来像一个定义明确的锯齿模式,在大约 0.5GB 和 1.8GB 之间振荡(分配了 2GB 的堆空间)。但是每次我断开连接都是在完整 GC 期间(但不是在每次完整 GC 时)。我看到完整的 GC 平均需要 1 秒多一点。根据一天中的不同时间,繁忙时 Full GC 每隔 5 分钟发生一次,或者在运行缓慢的情况下 Full GC 之间最多可以间隔 30 分钟。

我怀疑如果我可以减少 full GC 时间,客户端将能够更好地跟上传入的数据,但我对 GC 调优没有太多经验。有没有人知道这是否是个好主意,以及如何去做?或者是否有其他可行的想法?

**更新** 我使用了 -XX:+UseConcMarkSweepGC 并且它有所改进,但在非常忙碌的时候我仍然断开连接。所以我将堆分配增加到 3GB 以帮助度过繁忙的时刻,现在它似乎运行得很好,但只有 1 天没有断开连接。也许如果我有时间,我会尝试减少产生的垃圾量,我相信这也会有所帮助。感谢所有建议。

最佳答案

Full GC 可能需要很长时间才能完成,而且调优也不是那么容易。

(轻松)调整它的一种方法是增加堆空间——一般来说,将堆空间加倍可以使两次 GC 之间的间隔加倍,但会使 GC 消耗的时间加倍。如果你正在运行的程序有非常明确的使用模式,或许你可以考虑增加堆空间,使间隔足够大,以保证有一些空闲时间来尝试让系统执行GC。另一方面,按照这个逻辑,如果堆很小,一个完整的垃圾收集将立即完成,但这似乎是自找麻烦多于帮助。

此外,-XX:+UseConcMarkSweepGC 可能会有所帮助,因为它会尝试并发执行 GC 操作(不会停止您的程序;参见 here)。

Here's Til Gene(Azul 系统的首席技术官,高性能 JVM 的制造商,并发布了多个 GC 算法)关于 JVM 中一般 GC 的非常精彩的演讲。

关于java full gc 花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16677281/

相关文章:

java - 求 BST 中数组元素的层数

java - 无法显示 Jersey 的 JSP : MessageBodyWriter not found for media type=text/html

php - 我应该如何修改站点地图?

java - 超出 GC 开销限制

java - java中如何使用三个线程同时读取文件?

java - 获取不同运营商的Cell ID

android - android中的处理性能

java - 我这里有什么大O符号?

Python垃圾回收发生在变量重置中

java - 吞吐量垃圾收集