增加的CPU负载是从哪里来的?

4
我遇到了一个应用程序问题。当我长时间运行它时,CPU负载会缓慢增加。以下是Java VisualVM的截图,持续了45分钟。
如您所见,内存使用非常稳定,线程数量也是如此。该应用程序打开一个局域网套接字并每2秒钟进行一次测量。这个测量在一个单独的线程中运行(可以在右下方的线程图中看到)。
CPU使用率缓慢但肯定地增加,过夜后积累到70-80%左右,此时整个系统明显减速。现在我当然不希望出现这种增加,但找不到原因。没有内存泄漏(这将导致内存持续增加),我也不会产生越来越多的线程(因为计数也是稳定的)。
我的应用程序有一个广泛的GUI和几个线程。以下是分析器的线程列表:
我用黄色标记了“我的”线程。因此,MeasurementCommunication.startMeasurement线程在需要时创建(并再次终止)。因此,任何时候都只有其中一个人在运行。
长话短说:我不知道这个CPU增加来自哪里。您有任何想法吗?也许这是一个普遍的Java问题?
如果您需要更多信息或细节,请告诉我,我会尝试回答它们。 ;)

3
分析 CPU 使用率,并查看在其高峰期哪些地方存在瓶颈。 - bmargulies
2
你监控过GC时间吗(例如使用-verbose:gc)? - assylias
@assylias那会带来什么?你认为垃圾回收器没有正确地执行它的工作吗? - brimborium
1
增加GC时间可能会显示堆碎片问题或其他问题。这是哪个JVM版本和在哪个操作系统上?您是否使用任何特殊的VM参数?您肯定不会耗尽permgen,对吧? - Gray
1
@brimborium 垃圾回收可能已经在工作了,但监控垃圾回收所花费的时间可以告诉你是否需要进一步调查这个领域。 - assylias
显示剩余3条评论
1个回答

3

仅仅看一下你的已用堆内存,从17:00开始看上去是在不断增加的。你需要将其捕获更长时间,并确保它会回落并保持稳定,如果它开始产生类似步进式的结果,即不断向上递增,那么可能是内存泄漏导致的问题,这会影响到你的CPU。因此,简而言之,你需要在堆内存增长时特别注意观察它。所以,在每次完整垃圾回收之间的状态......


谢谢您的建议。我会让它在晚上运行。也许那会给我更多的见解。Java中的内存泄漏会如何发生?垃圾回收器不是定期释放未使用的内存吗? - brimborium
基本上,垃圾回收有两种形式:完全回收和部分回收-请阅读此内容以了解如何启用记录完全回收或部分回收http://www.theserverside.com/discussions/thread.tss?thread_id=63241-然后查看日志以了解何时发生并检查您的图表-图表本身应该会给出提示-如提到的那样,如果它像螺旋形一样向上走,则内存泄漏将是原因.......... - V H

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