在 Java VisualVM 中看不到我自己的应用程序方法

2022-09-02 14:07:41

我正在尝试分析我的java应用程序,只是为了找出花费最多时间的方法。鉴于这里对TPTP的不良反应,我想我会尝试一下Java VisualVM。

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

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

我尝试过将检测限制为仅我自己的包,这似乎减少了检测方法的数量,但我似乎仍然没有看到我自己的方法。

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

我必须做些什么来确保我的类得到检测?是否存在计时问题? ..比如,必须等待类被加载等?我还尝试了两次运行代码的内脏,以确保所有代码都得到执行......

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

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

如果有任何关于我可能做错什么的建议,我将不胜感激!:)

谢谢!


答案 1

我也在为VisualVM而苦苦挣扎,这很可惜,因为它的用户界面非常棒,而它的性能分析输出似乎很糟糕。你可以在这里看到我的问题。

Java VisualVM为CPU分析提供了奇怪的结果 - 还有其他人遇到过这种情况吗?

我可以告诉你一些奇怪的事情,我已经了解了VisualVM以及它似乎进行分析的方式。

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

其他探查器(如 JProfiler 和 Azul 使用的探查器)不会将阻塞的线程计为占用探查器的正常运行时间。这意味着,对于性能分析来说,可能不感兴趣的(取决于情况)的阻塞方法会掩盖您对占用 CPU 时间的代码的看法。

当我运行我的分析时,我最终得到了

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

直到该消息返回到等待线程,然后在这两个完全不相关的方法以及不会出现在其他分析器上的各种其他无趣方法之间共享顶部位置,从而掩盖了我的分析。

其次,我认为非常重要的一点是,方法过滤机制并不像我预期的那样有效。这意味着我无法过滤掉我现在试图追踪这个故事是什么。

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


答案 2

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

精简版有很多限制,例如最多10分钟采样和最大30个业务事务发现。

如果有一个免费的工具做同样的事情就好了。


推荐