Java垃圾回收- CPU波动- 连接建立时间变长

3
我们有一个服务器池,位于负载均衡器后面。该池中的机器平均每6秒进行一次垃圾回收,垃圾回收需要近半秒的时间。我们还会在垃圾回收期间看到CPU峰值。
客户端机器在一天内连接服务器的平均时间会增加近10%。
理论上,CPU正在忙于进行垃圾回收,这就是为什么它不能更快地分配连接的原因。
JVM:IBM GC算法:gencon Nursery:5 GB Heap Size:18 GB

当垃圾回收发生时,CPU需要做一些工作,听起来好像有大量的垃圾回收正在发生(半秒钟的时间),这很可能是消耗CPU周期的原因。 - Deco
1/2 秒的 GC 时间是针对 Nursery GC 还是 tenured 的? - AngerClown
对于幼儿园而言,它的容量增长得非常快。因此,在高峰期每6秒钟就必须运行GC。 - Vanchinathan Chandrasekaran
2个回答

3

我认为当有这么多的分配时,一切皆有可能--随着时间的推移,情况可能会变得更糟。如果您全天都在每6秒钟进行GC处理,那似乎是有问题的。

您能访问该代码吗?它是否可以重写以重用对象并更智能地进行分配?我做过几个嵌入式系统,诀窍是在系统启动后永远不要调用new(如果您控制整个系统,这很容易实现)。

如果您无法访问代码,请查看可用的GC调优选项(包括使用的垃圾收集器的选择)-包括JDK和第三方选项。您可以通过几个命令行修改来提高性能。


我们增加了堆大小,似乎减少了经常发生的CPU峰值。我们正在尝试对应用程序进行分析以查看我们使用了多少内存。 - Vanchinathan Chandrasekaran
在循环中寻找"new",可能会实例化整个对象树,只为获取一些小片段,然后在下一次迭代中忘记它。一个好的分析器也会有很大帮助。祝你好运。 - Bill K

2

我想这是可能的。

鉴于垃圾回收是如此密集的过程,它每6秒发生一次是否有任何原因?我不熟悉IBM JVM或您使用的特定收集算法,因此无法对其进行评论。然而,Sun(现在由Oracle提供)提供了一些优秀的调整文档,介绍了不同类型的收集器以及何时使用它们。请参见此链接获取一些思路。

证明您的理论的一种方法可以添加一些代码,记录请求连接的时间和实际分配连接的时间。如果与较长的连接分配时间相关的GC相关CPU峰值似乎相符,则会证明您的理论。然后您的问题将变成如何解决它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接