2010-07-14 100 views
19

我试图剖析我的Java应用程序,只是为了找出大部分时间花在哪些方法上。鉴于对TPTP的反应不佳,我想我会给Java VisualVM一个去。在Java VisualVM中看不到我自己的应用程序方法

这一切似乎都相当简单 - 除了我似乎无法得到任何一致或有用的东西外。

我似乎无法看到与我自己的代码有关的任何东西 - 我得到的只是一大堆调用java *。方法之类的东西。

我试过限制仪器只有我自己的软件包,这似乎减少了仪器的方法数量,但我似乎从来没有看到我自己的。

每次运行时,我都会收到不同数量的方法,从10到1000不等。 我已经尝试在我的应用程序的开始时进入睡眠状态,以确保在应用程序开始执行任何有趣的操作之前启动并运行VisualVM,以确保它在有趣的东西运行时进行分析。

有什么我必须做,以确保我的课得到仪器? 是否有计时问题? ..喜欢,必须等待类加载等? 我也尝试了两次运行代码的胆量,以确保所有的代码都得到了锻炼...

我只是在Eclipse中运行一个带有main的应用程序。我尝试过使用Eclipse集成,以便在启动应用程序时启动VisualVM - 结果相同。 我也尝试将应用程序导出为可运行的应用程序,并从命令行单独运行,而不是通过Eclipse运行 - 结果相同。

我的应用程序不是一个长时间运行的web应用程序等 - 只是一个主要调用我自己的一些其他类来做一些处理,然后退出。

我很感激任何关于我可能做错的建议! :)

谢谢!

+0

我不知道这是否会有所作为,但是您是否编译了没有任何调试信息的应用程序?或者你的应用程序使用自定义类加载器? – 2010-07-14 04:02:54

+0

有一个小小的教训,但简单而有效的技术:http://stackoverflow.com/questions/266373/one-could-use-a-profiler-but-why-not-just-halt-the-program/317160# 317160 – 2010-07-14 11:59:24

回答

0

我认为这不仅仅是一个学术问题 - 你想看看你是否可以让应用程序运行得更快。我想你也不会介意一点“开箱即用”的想法。有许多关于表现的流行想法实际上很模糊。

例如,你说你正在寻找“大部分时间都花费在其中的方法”。如果你的意思是“自我时间”(实际上是在方法中的程序计数器),那么可能很少,除非你有一些强烈的循环。方法通常通过调用其他方法来花时间,有时做I/O。

另一个模糊的想法是,测量方法时间或计算通话次数可以告诉你非常多的瓶颈问题。瓶颈是特定的代码行,而不是方法,所以即使你知道大概在哪里看,你仍然在玩侦探。

所以这些是一些模糊的想法。 Here is a bunch more.让我建议如何一个思考它,以及如何导致结果。

当你最终修复某些东西时,它会减少一些百分比的执行时间,比如(选择一个数字)30%,对吧? (否则,你没有解决任何问题。)好的,在30%的时间里,它正在做一些事情,这是它不需要做的,因为后来你摆脱了它。所以,你不需要需要衡量。你需要找出它在做什么在那个时候,所以你知道该怎么摆脱。

一个非常简单的方法是随机“暂停”它10次(或几次)。通过查看调用堆栈以及可能的一些数据,了解它在做什么以及为什么。在大约3次的时候,你会看到它做了一些你可以摆脱的事情。

你会知道看看百分之多少的样本显示它会节省多少钱。 近似就够了。您可以很容易地看到通过在前后查看节省多少时间。

然后,不要停下来。您已经使应用程序更快。再做一次,并让它更快。迟早你会得到一个不能让它变得更快的点,但它可能不止一步。

1

您可以看看Appdynamics lite,它具有很好的功能,例如业务事务发现功能,可以对您的代码中的特定方法进行的所有调用进行采样。

lite版本有很多限制,例如10分钟采样最大值和30个业务交易发现最大值。

它会是不错的做同样的

5

我也是用的VisualVM,这是一种耻辱,因为它的用户界面是太棒了,而它的轮廓似乎输出恐怖挣扎的免费工具。你可以在这里看到我的问题。

Java VisualVM giving bizarre results for CPU profiling - Has anyone else run into this?

我可以告诉你一对夫妇,我已经了解了VisualVM的,似乎做了剖析的方式奇怪的事情。

VisualVM似乎在计算在一个方法(挂钟时间)内花费的总时间。我在我的应用程序中有一个线程,它启动了许多其他线程,然后立即阻止在队列中等待消息。直到其他线程之一发送第一个线程正在等待的消息(应用程序终止时),VisualVM才会在分析器中注册此方法。突然,阻塞方法调用支配分析输出,并被记录占用超过80%的应用程序时间。

其他分析器(例如JProfiler和Azul使用的分析器)不会计算被阻塞的线程占用分析器的时间。这意味着对性能分析可能不感兴趣(情况相关)的阻塞方法掩盖了您正在占用CPU时间的代码视图。

当我跑我的分析我结束了

sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run()

模糊我的分析正确,直到该消息回来等待线程,然后在这两个完全不相关的方法之间共享顶部位置,以及其他各种不感兴趣的方法,这些方法不会出现在其他配置文件中。其次,我认为非常重要的是方法过滤机制并不像我期望的那样工作。这意味着我无法过滤掉我正在试图追踪这个故事的现状。

不是一个真正有用的答案。我现在看到的解决方案是支付JProfiler - VisualVM对于这项任务似乎不值得信赖。

+0

我和@ francis-stephens有同样的问题还没有找到解决方案 – 2014-05-21 03:13:49

相关问题