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