java - 为什么我的 Java 应用程序在附加分析器的情况下运行得更快?

标签 java opencv netbeans jvm profiling

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

一开始不敢相信,但结果是正确的。 再次尝试了几次,但应用程序总是在附加分析器的情况下运行速度快 10 倍。我也尝试直接从 Windows 命令行运行编译后的 .jar 文件,但计算一次又一次地花费了大约一分钟。

附加的分析器怎么可能提供如此巨大的性能提升?它对 JVM 或应用程序有什么改变?

顺便说一句,如果有任何不同的话,我在这些计算中使用原生 OpenCV 和提供的 Java 包装器。

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

最佳答案

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

如果你运行 jcmd你应该看到一个进程列表。然后你可以运行 jcmd <id> VM.flags查看 JVM 配置的内容,并验证应用程序在分析器下和不在分析器下的情况是否相同。

另一种可能性是您的程序过度锁定,并且这种过度锁定会在未附加探查器时导致您的应用程序出现抖动。附加它后,锁定可能会变慢,从而导致应用程序线程协作并最终取得更快的进展。

然而,这些只是关于如何进一步调查的建议;很可能还有另一个您看到的完全不同的尚未发现的问题(例如,它默认为不同级别的日志记录......)

关于java - 为什么我的 Java 应用程序在附加分析器的情况下运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610247/

相关文章:

python - 带有 opencv 的 matplotlib 给出具有相同像素值的不同图像

c# - 有没有办法使用与OpenCv的MinMaxLoc类似的方法来获取n个最大值的列表,而不是仅一个最大值?

java - 将 .java 转换为 .jar 或 .exe 以获取单个 .java 文件

java - 使用文件协议(protocol)的 Jmeter HTTP 请求未获取所有文件

java - 在android中将图像上传到服务器而不以多部分形式更改

java - 黑莓应用程序显示空白屏幕

java - 使用 try-with-resources 包围扫描仪

Java:将变量存储在文件中

javascript - 如何在opencv JS中读取图像

tomcat - 如何在 Netbeans 中为 Java 服务器更改为不同的端口来监听?