测量Java程序性能

测量Java程序性能,java,profiling,performance-testing,Java,Profiling,Performance Testing,我有一个旧的应用程序,一个JAR文件,它经过了一些增强。基本上,代码的某些部分必须在修改某些逻辑的同时进行修改 将旧版本与新版本进行比较,新版本大约比旧版本慢2倍 我试图缩小导致速度减慢的原因,但我发现自己正在使用System.println和System.currentTimeMillis()测量某些循环的时间。这真的很无聊 有没有Java性能工具可以帮助我弄清楚为什么新的JAR比旧的慢2倍 提前感谢。根据进程的运行时间,我会考虑使用Visual VM 1.3.3。如果你下载了所有的插件,你将

我有一个旧的应用程序,一个JAR文件,它经过了一些增强。基本上,代码的某些部分必须在修改某些逻辑的同时进行修改

将旧版本与新版本进行比较,新版本大约比旧版本慢2倍

我试图缩小导致速度减慢的原因,但我发现自己正在使用System.println和System.currentTimeMillis()测量某些循环的时间。这真的很无聊

有没有Java性能工具可以帮助我弄清楚为什么新的JAR比旧的慢2倍


提前感谢。

根据进程的运行时间,我会考虑使用Visual VM 1.3.3。如果你下载了所有的插件,你将能够看到堆,线程,对象等,这应该会有所帮助,而且不会花一分钱


我相信它假设Oracle/Sun JVM。

您应该使用探查器。这将向您展示哪些方法花费的时间最多(以及调用它们的方式),而无需您猜测要度量哪些方法

Java附带了一个名为的内置探查器,但也请参见:

  • 技术和工具
像这样的探查器工具或可靠地测量性能的工具对于您的案例来说是很好的证据。看看那些工具。
前者会在代码和/或内存泄漏(并非全部)中发现瓶颈,而后者是一种API,您可以可靠地测量性能,因为Oracle的JVM和OpenJDK无法可靠/一致/准确地获取性能指标(如CPU挂钟时间或从应用程序、内存使用、应用程序线程等花费的CPU时间)。

默认情况下,Java为这些东西提供包。

例如:
java.lang.management.ManagementFactory

java.lang.management.ThreadMXBean

但是,根据您的情况,它们可能是足够的,也可能不是足够的(请记住,除非我们讨论的是一些关键问题,否则大多数情况下它们都可以)。

具有比较CPU快照的功能。记录旧JAR文件和新JAR文件的执行情况,并保存快照(如果JVM最后退出,请配置“JVM退出”)保存快照的触发器)

然后用“Session->Compare Snapshots in New window”(会话->在新窗口中比较快照)打开快照比较窗口,添加两个快照。热点比较如下所示(本例中设置了视图过滤器):

它将立即向您显示哪些方法是导致执行时间增加的原因

分析执行时间差异的另一种方法是调用树比较,如下所示:

免责声明:我的公司开发JProfiler。

另请参阅,可能还有其他几款。。。