如果您有一个Java应用程序,它在非';如果你什么都不做,你怎么确定它在做什么?

如果您有一个Java应用程序,它在非';如果你什么都不做,你怎么确定它在做什么?,java,profiling,Java,Profiling,我正在调用一个供应商的JavaAPI,在一些服务器上,JVM在登录到API后似乎进入了一个低优先级轮询循环(CPU使用率为100%)。其他服务器上的同一应用程序不显示此行为。这种情况发生在WebSphere和Tomcat上。环境的设置非常复杂,因此很难在Eclipse中进行类似于分析的操作 有没有一种方法可以评测(或其他一些方法来检查)Tomcat中运行的现有Java应用程序,以了解它处于这种状态时正在执行哪些方法?当应用程序处于此状态时,它只执行一个方法(供应商的方法)。供应商当然不能复制这种

我正在调用一个供应商的JavaAPI,在一些服务器上,JVM在登录到API后似乎进入了一个低优先级轮询循环(CPU使用率为100%)。其他服务器上的同一应用程序不显示此行为。这种情况发生在WebSphere和Tomcat上。环境的设置非常复杂,因此很难在Eclipse中进行类似于分析的操作

有没有一种方法可以评测(或其他一些方法来检查)Tomcat中运行的现有Java应用程序,以了解它处于这种状态时正在执行哪些方法?当应用程序处于此状态时,它只执行一个方法(供应商的方法)。供应商当然不能复制这种行为


更新:

使用JConsole,我能够确定谁在跑步以及他们在做什么。我花了几个小时才弄明白它为什么这么做。最终的问题是,供应商使用的API jar与它使用的数据库配置不完全匹配。默认情况下,在配置稍有不匹配的服务器上启用跟踪和性能监视。我用了一个不同的罐子,一切都很好

谢谢你的回答,约书亚。JConsole非常易于设置,并可用于监视现有应用程序


@畏缩-我用你建议的一些选项做了一些实验。我在安装JProfiler时遇到了一些问题,它看起来不错(但价格昂贵)。接下来,我添加了Eclipse Profiler插件,我将查看不同的开源探查器以比较功能。

如果您使用的是Java 5或更高版本,您可以使用连接到应用程序以查看所有正在运行的线程。jstack还将进行堆栈转储。我认为即使在像Tomcat这样的容器中,这种方法也应该仍然有效

这两个工具都包含在JDK5和更高版本中(我假设这个过程至少需要Java 5,尽管我可能错了)

更新: 还值得注意的是,从JDK1.6Update7开始,现在有一个名为的捆绑式探查器,可以使用“jvisualvm”启动。它看起来像是一个,所以其他信息可能会在该页面上提供。我还没有用过这个,但它看起来对更严肃的分析有用


希望这对你有所帮助

如果是出于职业目的,而你又有一些钱可以花,那就试着动手吧。如果你只是想获得一些见解,请尝试以下方法。我用了好几次,但我不知道现在的状态

eclipse项目本身也提供了一个新的(?)项目:(请参阅)。从未使用过,所以我不知道是否值得付出努力


上也有一个很好的开源分析器列表,它们面临着与我使用的相同的问题。除非您实际连接到它,否则它的加载程序不会激活(尽管它会打开一个端口来侦听连接)。分析器本身有一个很好的“获取在每个方法中花费的时间量”,同时在它不那么突兀的模式下工作


另一种方法是在具有最高优先级的“看门狗”线程中检测CPU负载(通过JNI,因此您需要一个外部库),并在CPU足够高且足够长的时间后开始记录所有线程。您可能会发现启发。

为了完整性起见:尽管我的公司或多或少地在Eclipse上实现了标准化,但我们每天都在its中使用Netbeans(6及以上)。它比Eclipse TPTP插件(最近一次检查是在3个月前)工作得更好,对我们来说,它不再需要像JProfiler这样的商业分析器,这很好,但很快就变得不必要了。

VisualVM应该是netbeans的独立分析器。我尝试了eclipse的TPTP,但visualVm似乎是一个更好的选择

使用探查器。是的,它们需要花钱,使用它们有时会有点尴尬,但它们确实为您提供了更多真实的证据,而不是猜测

人类普遍不善于猜测性能瓶颈在哪里。这似乎是我们的大脑不适合做的事情。这可能看起来很明显,你可能对问题所在有很好的想法,但现实世界往往是在做一些不同的事情。而优化代码中错误的部分,充其量也意味着要做大量的工作以获得最小的收益。更多的时候,它会使事情变得更慢,有时它会完全破坏事情。因此,在您为了优化而进行任何更改之前,您应该始终拥有来自探查器或其他精确工具的真实证据


如前所述,JProfiler和YourKit都相当不错,而且价格也不贵。上次我看的时候,他们都有免费的演示。

如果JConsole不能使用,你可以

  • 在Windows下按CTRL+BREAK
  • 在Linux下发送
    kill-3

以获得完整的线程转储。这不会影响性能,始终可以在生产中运行。

JRockit任务控制延迟分析器。

JRockit附带的延迟分析器向您展示了JVM在什么都不做的情况下正在“做”什么。在最新版本中,您可以看到以下各项的延迟:

  • Java等待/阻塞/睡眠/驻车
  • 文件I/O
  • 网络I/O
  • 内存分配
  • GC暂停
  • JVM延迟,例如代码生成和类加载
  • 螺纹悬挂
当延迟发生时,该工具将为您提供堆栈跟踪。您可以以多种不同的方式查看延迟数据(聚合跟踪、直方图、线程图等)。该工具还允许您查看线程之间的转换,例如当一个线程通知另一个线程时

开销可以忽略不计,并且与许多其他工具不同,它可以在生产环境中使用。 这给你一个简单的介绍,程序可以