2013-02-06 57 views
4

我确实遇到了我开发的应用程序的问题。当我长时间运行它时,CPU负载缓慢上升。这是45分钟后Java VisualVM的屏幕截图。增加的CPU负载来自哪里?

enter image description here

正如你可以看到,内存占用是非常稳定和线程,以及数量。应用程序打开一个LAN插座并每2秒进行一次测量。这个测量运行在一个单独的线程中(可以在右下方的线程图中看到)。

CPU使用率缓慢而稳定地增加,一夜之间累积到70-80%左右,此时整个系统明显放慢(显然)。现在我不想要这个增长,但是找不到原因。没有内存泄漏(这也会导致内存的连续增加),也不会产生越来越多的线程(因为这个计数也是稳定的)。

我的应用程序有一个广泛的GUI和几个线程。下面是从探查线程列表:

enter image description here

我标有“我”的线程黄色。因此,MeasurementCommunication.startMeasurement线程会在需要时创建(并再次终止)。所以只有其中一个人在任何时候运行。

因此,长话短说:我不知道这个CPU的增加来自哪里。你有什么想法?也许这是一个普遍的Java问题? 如果您需要更多信息或详细信息,请告诉我,我尝试回答。 ;)

+3

配置文件的CPU使用情况,并查看热点时它的位置。 – bmargulies

+2

您是否监控过GC时间(例如-verbose:gc)? – assylias

+0

@assylias会带来什么?你认为GC不能正确工作吗? – brimborium

回答

3

看看你已经使用过的堆,它从17:00开始出现向上,你需要做的就是长时间捕获它,并确保它爬升回来并保持/下来,但通常是平坦的使用情况,如果它开始产生像步骤一样的结果,即越来越高地增加,那么它可能是内存泄漏,从而导致问题影响你的CPU。所以总之你需要更长时间观察堆堆,特别是当堆爬上时。因此,每个完整的垃圾收集之间的状态....

+0

感谢您的建议。我会让它运行过夜。也许这给了我更多的见解。 Java中的内存泄漏如何工作? GC是否不定期释放未使用的内存? – brimborium

+0

yep基本上有两种形式的垃圾收集:全部和部分 - 有关如何启用日志记录全部gc或部分gc的阅读http://www.theserverside.com/discussions/thread.tss?thread_id = 63241 - 然后查看你的日志什么时候发生,并检查你的图表 - 它自己的图表应该提供一个线索 - 如上所述,如果它的螺旋像向上步骤那么内存泄漏将是原因...... .... – Vahid