我们使用oracle在JBOSS中运行JAVA应用程序。我们使用了Seam和Hibernate框架。我们面临的问题是,当我们启动应用服务器时,CPU使用率增加,小时,我们发现CPU的利用率接近90%。这是奇怪的,我无法确定问题。应用服务器攻击CPU利用率的原因
Please Help.Thanks in Advance。
干杯, Dwarak
我们使用oracle在JBOSS中运行JAVA应用程序。我们使用了Seam和Hibernate框架。我们面临的问题是,当我们启动应用服务器时,CPU使用率增加,小时,我们发现CPU的利用率接近90%。这是奇怪的,我无法确定问题。应用服务器攻击CPU利用率的原因
Please Help.Thanks in Advance。
干杯, Dwarak
使用分析器来发现问题。如果使用Oracle Java 6,请从JDK中的jvisualvm开始。
我已经完全监控了我的应用程序,并附上了jconsole堆的截图。请告诉我是否存在内存泄漏 – 2011-05-28 15:55:05
Dócpu分析。 – 2011-05-28 16:28:59
该怎么做? – 2011-05-28 18:38:08
理想情况下,您可以使用探查器来追踪问题。如果你不能在环境中使用探查器(比如制作),那么尝试在其他地方重现它,并在那里附加一个探查器。通常来说,这是很困难的,所以这里是我用过多次找到CPU利用率的生产从命令行原因一招:
watch -n1 'jstack [pid] | grep -A 1 RUNNABLE | grep -v RUNNABLE | grep -v \\-\\- | grep -v socketRead0 | grep -v socketAccept`
如果你看这个了很短的时间周期你可能会看到一些常用的方法被调用。接下来抢一个完整的jstack输出到文件:
jstack [pid] > jstack.log
现在在文件中搜索,你看到在显示经常起来的方法之一。通过堆栈跟踪,您通常可以找到负责研磨CPU的代码。如果什么都没有出现,那么也许你的时间会过度垃圾收集,你只需要增加内存。您可以使用:
`jmap -heap [pid]`
更好地了解内存使用情况。更好的是,您可以附加jvisualvm或商业分析器(如YourKit)随时间变化以图形方式查看。我也有时使用watch -n1 'jmap -heap [pid]'
。
jstack脚本的+1。 – 2011-05-28 07:12:00
我已经完全监视了我的应用程序,并附上了jconsole堆的截图。请告诉我是否有内存泄漏? – 2011-05-28 15:54:15
我无法读取jconsole堆,因为图像已缩小。但是我可以从内存图中知道你没有内存泄漏。锯齿图案正常健康。这听起来像你有像你怀疑的CPU问题。 – WhiteFang34 2011-05-29 00:34:52
如果上面没有任何帮助,最后的手段是去分析工具。我建议JProfiler或Yourkit Profiler(商业,但30天的线索可用),这是非常用户友好的。
我已经完全监视了我的应用程序,并附上了jconsole堆的截图。请告诉我是否有内存泄漏 – 2011-05-28 15:57:48
从堆利用率的图上看,这对我来说似乎很正常。堆填满时,调用GC并释放内存。随着时间的推移,似乎没有减少可用内存。但不可能保证这一点。你运行你的应用程序多久了?有时泄漏可能发生在长期执行后。此图表更新时您是否注意到CPU利用率问题? – 2011-05-28 17:51:37
我的CPU利用率增加了4%到65%。我们已经运行了大约7-8小时的应用程序。 – 2011-05-28 20:02:45
没有足够的细节来回答这个问题。如果运行Java应用程序(除了您在此问题中指定的应用程序以外),它是否与使用率相同?*如果您不在应用程序服务器上运行任何Java应用程序,会发生什么情况? – 2011-05-28 05:23:31