我正在调用供应商的Java API,并且在某些服务器上看起来JVM在登录API(CPU使用率为100%)后进入低优先级轮询循环.其他服务器上的相同应用程序不会出现此行为.这发生在WebSphere和Tomcat上.设置环境很棘手,因此很难尝试在Eclipse中进行分析.
有没有办法分析(或其他一些检查方法)在Tomcat中运行的现有Java应用程序,以找出在此spinwait类状态下正在执行的方法?应用程序只在进入此状态时执行一种方法(供应商的方法).供应商无法复制行为(当然).
更新:
使用JConsole我能够确定谁在运行以及他们在做什么.我花了几个小时才弄清楚它为什么这样做.问题最终是供应商使用的API jar与其使用的数据库配置不完全匹配.默认情况下,在配置中存在轻微不匹配的服务器上启用跟踪和性能监视.我用了一个不同的罐子,一切都很好.
谢谢,约书亚,你的回答.JConsole非常易于设置和用于监视现有应用程序.
@Cringe - 我做了一些你建议的一些选项的实验.设置JProfiler时遇到了一些问题,看起来不错(但价格昂贵).继续前进我继续添加Eclipse Profiler插件,我将查看不同的开源分析器来比较功能.
Jos*_*non 15
如果您使用的是Java 5或更高版本,则可以使用jconsole连接到您的应用程序以查看所有正在运行的线程.jstack也会进行堆栈转储.我认为这应该仍然可以在像Tomcat这样的容器内部工作.
这两个工具都包含在JDK5及更高版本中(我假设该过程至少需要Java 5,尽管我可能错了)
更新:值得注意的是,从JDK 1.6 update 7开始,现在有一个名为VisualVM的捆绑式探查器,可以使用'jvisualvm'启动.看起来它是一个java.net项目,因此该页面上可能有其他信息.我还没有使用它,但它对于更严肃的分析看起来很有用.
希望有所帮助
面对同样的问题,我使用了YourKit profiler.它的加载器不会激活,除非您实际连接到它(虽然它确实打开一个端口来侦听连接).探查器本身有一个很好的"在每种方法中花费的时间",而在它不那么突兀的模式下工作.
另一种方法是在具有最高优先级的"看门狗"线程中检测CPU负载(通过JNI,因此您需要一个外部库),并在CPU足够长时间内开始记录所有线程.你可能会发现这篇文章很有启发性.