9

我正在使用 Java 编写算法实现。在 OS X 10.7 之前,我使用 Shark Profiler 来分析我的实现,效果很好。但是,新的 Instruments 不再找到过程名称。我已经尝试使用 Shark 的 VM 参数(即 -agentlib:Shark )运行 java 应用程序,但它们在 10.7 中是未知的,而且我找不到这样的仪器代理库。

关于如何将程序名称附加到仪器中的符号名称(一些十六进制数字)的任何想法?我正在使用 Eclipse Indigo,如果这有什么不同的话。

谢谢!

编辑:到目前为止,OS X Mountain Lion 没有任何改变。

编辑#2:(?)开发人员通过苹果的错误报告者的更新:

dtrace 过去曾支持 Java 堆栈,但老实说,我不能说是否一直保持支持。对于您要测量的内容,这可能是一种可行的解决方法——否则,这不是性能工具目前的优先事项。您可能希望从 /usr/bin/cpu_profiler.d 中的 D 脚本开始,并修改它以收集 jstack。

编辑#3:好的,经过更多讨论后发现开发人员本人并不知道该脚本的来源。显然,Instruments 中的时间分析器无论如何都不使用 DTrace,所以剩下的唯一选择就是编写我们自己的 DTrace 脚本或工具。

你是对的,我道歉。我不确定那个脚本是从哪里来的,当我仔细查看它时,它没有 jstack 动作,所以它不是你想要的。看起来我可以为您提供的唯一 java 分析选项是 DTrace。DTrace 有一个配置文件提供程序和一个收集 java 堆栈的 jstack 操作。您可以使用“聚合”来确定最重的堆栈跟踪,所有这些都可以在命令行中进行。DTrace 的文档主要由 Sun 维护,我会指导您阅读任何 DTrace 教程,因为大多数都包含配置文件提供程序。

不管人们在网上怎么说,Instruments 并没有在所有事情上都使用 DTrace,特别是时间分析,所以我无法在 Instruments UI 中为您提供快速修复。

4

3 回答 3

5

Instruments 依赖于 Sun 开发的一款名为 dtrace 的可爱软件。dtrace 有一个名为 'jstack()' 的函数,它应该打印带有 java 符号的堆栈跟踪,还有一个 'ustack()' 应该为其他语言(python、node.js 等)做类似的事情。 )。不幸的是,OS X 的 dtrace 版本不支持这些方法,因此 Instruments 不会提供该功能。

所以,不幸的是,在 Apple 修复他们的东西之前,你不会从这些工具中获得这些信息。:(

关注此线程以获取更多信息: http: //www.mail-archive.com/dtrace-discuss@opensolaris.org/msg04863.html

我已经向苹果提交了一个关于他们缺乏对帮助堆栈跟踪器的支持的错误,如果你想要这个功能,你也应该提交一个错误: https ://bugreport.apple.com

于 2013-03-28T21:09:01.943 回答
0

我想到的一件事是编译器可以-g选择javac包含调试信息。在 eclise 中(至少在 helios 中),您可以在“Java 编译器”、“类文件生成”下设置不同的数据调试选项。也许其中一些设置被破坏了。

然而,这并不能解决方法名称的问题,方法名称总是包含在类文件中。然而,不同风格的 Java VM 以不同的方式执行运行时优化,例如,请参阅文档中关于堆栈跟踪可靠性的注释。

因此,切换到另一个(版本)VM 可能会影响分析器执行正确操作的能力。- 顺便说一句,您没有在此过程中隐式“升级”您的 Java 版本(例如 1.6 到 1.7)?

于 2012-12-17T20:36:46.260 回答
0

如果您想分析 Java 应用程序,我建议您使用 Oracle 的 Visualvm(通过 Java.net)。该工具可以将内存和 cpu 分析到该方法,即使对于远程 JVM 也是如此。在 OSX 上,它显然不是默认 JDK 的一部分,但您可以在这里获得它:http: //visualvm.java.net/download.html 可能是鲨鱼的替代品。

于 2012-12-18T21:09:27.573 回答