我们有一个位于负载平衡器后面的服务器池。这个池中的机器平均每 6 秒进行一次垃圾收集。垃圾收集需要将近半秒的时间。我们还看到在垃圾收集期间出现 CPU 峰值。
客户端计算机在一天内连接到服务器的平均时间几乎达到 10%。
理论:CPU 正忙于执行 GC,这就是它无法更快地分配连接的原因。
这是一个有效的理论吗?
JVM:IBM GC算法:gencon 托儿所:5 GB 堆大小:18 GB
最佳答案
我想说的是,对于如此多的分配,所有的赌注都没有了——随着时间的推移,情况绝对会变得更糟,我的意思是,如果你整天每 6 秒执行一次 GC,这似乎有问题。
您可以访问该代码吗?是否可以重写以重用对象并更智能地进行分配?我已经完成了一些嵌入式系统,诀窍是一旦系统启动并运行就永远不要调用 new(如果你能控制整个系统,这是可行的)
如果您无权访问代码,请检查一些可用的 GC 调整选项(包括使用的垃圾收集器的选择)——它们都随 JDK 和第 3 方选项一起分发。您可以通过一些命令行修改来提高性能。
关于Java 垃圾收集 - CPU 峰值 - 更长的连接建立时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8812788/