为什么我的Java应用程序运行速度更快,附加了探查器?

时间:2016-04-13 21:52:10

标签: java opencv netbeans jvm profiling

我正在Netbeans中开发Java 8 SE应用程序。我最近添加到应用程序的一项新功能运行得太慢(大约一分钟,直到计算停止)。所以我启动了探查器,看看主要的瓶颈是什么。令我惊讶的是,计算在大约7秒内完成。

一开始无法相信,但结果是正确的。 再次尝试了几次,但应用程序附加的应用程序总是运行速度提高10倍。我还尝试直接从Windows命令行运行已编译的.jar文件,但计算一次又一次花了大约一分钟。

附加的分析器如何能够提供如此巨大的性能提升?它对JVM或应用程序有何变化?

顺便说一下,如果它有所不同,我在使用提供的Java包装器的这些计算中使用本机OpenCV。

//编辑 - 附加信息:我使用的是内置的Netbeans 8.1分析器,我相信它基本上就是VisualVM。至于分析方法,我选择监视“方法”及其执行时间和调用计数。性能提升发生在仪表化和采样分析中。

1 个答案:

答案 0 :(得分:0)

不幸的是,可能没有一个单一的答案可以解释为什么会这样。当然,这取决于程序正在做什么以及程序如何启动。例如,如果您使用分析器启动应用程序(而不是之后连接),则可能是分析器使用不同的配置(堆大小,垃圾收集器等)启动,这是导致差异。

如果您运行jcmd,您应该会看到一个进程列表。然后,您可以运行jcmd <id> VM.flags以查看已配置JVM的内容,并在分析器下以及何时不验证应用程序的相同内容。

另一种可能性是您的程序过度锁定,并且当分析器未连接时,这种过度锁定会导致应用程序发生颠簸。随着它的附加,锁定可能会更慢,导致应用程序线程协作并最终加快进度。

然而,这些仅仅是您如何进一步调查的建议;很可能还有另一个尚未发现的问题,你看到的是完全不同的问题(例如,它违反了不同级别的日志......)