Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调试JBoss 100%CPU使用率_Java_Debugging_Jboss_Web Applications_Cpu Usage - Fatal编程技术网

Java 调试JBoss 100%CPU使用率

Java 调试JBoss 100%CPU使用率,java,debugging,jboss,web-applications,cpu-usage,Java,Debugging,Jboss,Web Applications,Cpu Usage,最初发布在这里,有人建议最好在这里问这个问题 我们正在使用JBoss进行两场战争。一个是我们的web应用程序,另一个是我们的web服务。web应用程序访问另一台计算机上的数据库,并向web服务发出请求。web服务向其他机器发出JMS请求,聚合数据并返回数据 在我们最大的客户机上,大约每月一次JBossJava进程占用所有CPU的100%。运行JBoss的机器有8个CPU。在此期间,我们的web应用程序仍然可以访问,但是页面加载大约需要3分钟。重新启动JBoss会使一切恢复正常 数据库机器和所有其

最初发布在这里,有人建议最好在这里问这个问题

我们正在使用JBoss进行两场战争。一个是我们的web应用程序,另一个是我们的web服务。web应用程序访问另一台计算机上的数据库,并向web服务发出请求。web服务向其他机器发出JMS请求,聚合数据并返回数据

在我们最大的客户机上,大约每月一次JBossJava进程占用所有CPU的100%。运行JBoss的机器有8个CPU。在此期间,我们的web应用程序仍然可以访问,但是页面加载大约需要3分钟。重新启动JBoss会使一切恢复正常

数据库机器和所有其他机器都正常,只有运行JBoss的机器受到影响。内存使用是正常的。网络利用率正常。JBoss日志中没有可疑的错误消息

我已经建立了一个尽可能接近客户机生产环境的测试环境,并且我已经用2倍的并发用户数进行了负载测试。我还没有让我的测试环境复制这个问题

我们将从这里走向何方?我们怎样才能缩小问题的范围

目前我们唯一的计划是等到问题在生产中自行出现,然后进行一些调试以确定原因。到目前为止,当问题发生时,人们刚刚重新启动JBoss,以尽量减少停机时间。下一次发生这种情况时,他们会让开发人员来看看。问题是,下次发生这种情况时,可以采取什么措施来确定原因

我们可以在同一个盒子上设置一个单独的JBoss实例,并将web应用程序与web服务分开安装。这样,当问题再次出现时,我们将知道哪场战争有问题(假设这是我们的代码)。但这并没有缩小范围

我应该启用JMX远程吗?这样,下次出现问题时,我可以连接VisualVM,查看哪些线程占用了CPU以及它们到底在做什么。但是,在生产环境中启用JMX remote是否存在明显的缺点

是否有其他方法可以查看哪些线程正在占用CPU,并获取堆栈跟踪以查看它们在做什么

还有其他想法吗


谢谢

我认为,为了重现您的问题,您绝对应该尝试使用一些负载测试来建立一个测试环境。分析肯定会有助于查明问题


一个快速修复方法是下次使用kill-3杀死jboss,以便得到一个要分析的转储。我要检查的第二件事是,您正在使用-server标志运行,并且您的gc设置正常。您还可以运行一些dstat,以查看进程在锁定期间执行的操作。但是,再次强调,只设置一个负载测试环境(通过EC2或其他方式)来重现这一点可能更安全。

这通常发生在代码失控或不安全的线程访问哈希映射时。一个简单的线程转储(kill-3,如@disown所说,或windows控制台中的ctrl-break)将揭示这个问题

由于您无法使用测试复制它,我认为它闻起来像是并发问题;通常很难让测试脚本表现出足够的随机性来捕捉这种类型的问题


我通常会尝试将对任何因操作异常而重新启动的JVM执行线程转储作为标准操作过程,而这实际上是每月捕获一次的要求。

有一种快速而肮脏的方法可以识别哪些线程正在使用JBoss上的CPU时间。使用浏览器进入JMX控制台(通常是打开的,但您可能会有所不同),查找名为
ServerInfo
的bean,它有一个名为
listThreadCpuUtilization
的操作,该操作以一种很好的表格格式转储每个活动线程使用的实际CPU时间。如果有一个行为不端,它通常会像拇指酸痛一样突出

还有
listThreadDump
操作,它将每个线程的堆栈转储到浏览器


没有分析器那么好,但更容易获得基本信息。对于生产服务器,连接探查器通常是个坏消息,这非常方便。

如果您使用的是JBoss 5.1.0 EAP,JBoss中有一个bug,它们也有一个修复程序。 以下是网址:

我有一个测试环境设置,我一直在使用研磨机锤击它。我无法重现那里的问题。不知道为什么。也许我的测试没有使用相同的或广泛的数据。我已经分析了我的测试,以确保通常没有线程争用。我确实发现生产部门没有使用-server,为此我向某人大喊大叫。:)GC设置是默认设置。这么糟糕吗?我一定会查看你列出的命令。抱歉,Nate,错过了你文章中的负载测试部分。在回答之前,我真的需要开始阅读帖子:)我已经准备好了工具,可以在下次生产中出现问题时调试它!此客户端使用Windows(不问)。我最终使用了CDB,一个Windows工具,来获取所有时间的线程CPU使用率和本机ID。我有一个脚本可以在两次运行之间用10秒的时间运行两次,而变化最大的线程才是罪魁祸首。然后从JDK运行jstack以获取线程堆栈跟踪,包括本机ID。现在我们只需要再次制作杂烩我查过了。它非常有用!虽然您必须使用线程名称而不是ID来关联线程CPU利用率列表和线程堆栈跟踪,但我们只是使用它来跟踪我们环境中的某些内容。谢谢,你好。你找到JBoss问题的根本原因了吗?我们时常遇到同样的问题。是的,很抱歉耽搁了。我们有一个HashMap被两个线程同时写入。如果一个put触发重新刷新,则第二个put会导致两个映射节点相互指向。HashMap上的下一个get将触发一个无限循环。