【问题标题】:Why won't the VisualVM Profiler profile my application?为什么 VisualVM Profiler 不能分析我的应用程序?
【发布时间】:2012-03-06 23:08:44
【问题描述】:

我创建了一个简单的 1 文件 java 应用程序,它遍历一个循环、调用一些函数、分配一些内存、添加一些数字等。我通过 eclipse 的 Run As->Java Application 运行该应用程序。

正在运行的应用程序显示在Local 下的 Java VisualVM 中。

我双击该应用程序并转到 Profiler 选项卡。

默认设置为:

Start profiling from classes: my.main.package.**

Do not profile classes: java.*, javax.*, sun.*, sunw.*, com.sun.*

我点击CPUCPUMemory 按钮灰显。什么都没有发生。

Status 表示profiling inactive

当我的应用程序终止时,Status 表示 application terminated

我在这里做错了什么?我需要调整一些设置吗?启动应用程序时是否需要设置 VM 标志?

【问题讨论】:

  • @Mikaveli 我会考虑的。但是,正如我在下面描述的那样,它实际上没有用。我仍然无法使用-J-D... 选项将jvisualvm 指向从eclipse 启动的东西。我感谢您的洞察力并尝试提供帮助,但遗憾的是它没有奏效。另请注意,此问题已关闭。
  • 关于 hsperfdata 的注释是 JVisualVM(和其他应用程序)从中获取进程信息的地方 - 学习这将有助于您和其他人在未来调试任何问题。如果-J 选项不起作用,这只能是因为您没有将它指向实际的 java.io.tmdir(Eclipse 会覆盖标准位置)。这是将 JVM 参数传递给 JVisualVM 的记录方法。它现在起作用的原因很容易与我提到的错误(文件夹位置的大小写敏感)有关,该错误根据您登录的用户名的大小写“自行修复”。值 15 代表? :)
  • 我不同意这个被关闭,因为我遇到了完全相同的问题!我在这里尝试了这些建议,但没有运气,并想添加我自己的答案:您最好安装 Eclipse 插件,地址为 visualvm.java.net/eclipse-launcher.html 。它对我有用。
  • @KevinPauli 我要求关闭它,因为我无法再重现该问题。从那以后我也没有遇到过这个问题。我不完全确定是什么情况导致了这个问题。
  • 这个问题仍然有很多流量。也许我们可以重新打开它,以便将来帮助某人?

标签: java debugging profiling visualvm


【解决方案1】:

在 java 1.7.0_45 更新后我遇到了同样的问题。我不得不删除以下文件夹:

C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'

这样做之后,一切都像魅力一样。

【讨论】:

  • 我遇到了同样的问题,只是去硬盘属性 -> 磁盘清理并检查删除临时文件,然后运行磁盘清理并解决了这个问题。如果您不想寻找上述文件,这也可以解决问题。
  • @JonnyD91 感谢信息。
  • 这是唯一对我有用的答案:真的 delete 这个文件夹。
【解决方案2】:

我猜这个问题与从 Eclipse 中启动的应用程序有关,这是因为 JVisualVM 期望在 java.io.tmpdir 目录(通常是 Windows 系统上的 C:\Users\[your username]\AppData\Local\Temp\hsperfdata_[your username])中找到数据。

假设而不是在 JPS、JVisualVM 等期望它的正常位置,Eclipse 将数据放在它自己的临时文件夹中?

如果是这样,请尝试使用 jvisualvm -J-Djava.io.tmpdir=[Eclipse's temp directory] 调用 JVisualVM 以明确告诉它该数据在哪里。

如果您找不到 hsperfdata_$USER 文件夹,请尝试在 Eclipse 之外以通常的命令行 Java 方式运行您的应用程序。

另请注意,在 1.6.0_23 左右引入了一个影响临时文件夹(区分大小写)的错误,因此更新到较新的 Java 6(或 7)版本可能会让您受益?

【讨论】:

  • 感谢您的建议。将 -J-D 选项添加到 (j)visualvm 只会给我一个错误,即找不到本地 java 进程。但是,我现在无法重现我原来的问题。探查器现在似乎对我来说工作得很好......
  • 您必须使用visualvm 可执行文件(在\bin 文件夹中)。 -J 选项表示传递给 JVM - 其余语法与您通常向 JVM 添加参数完全相同。
  • 我想你的意思是jvisualvm,但是是的,我就是这么做的。当它启动时会显示一个错误对话框弹出窗口,上面写着Local Java applications cannot be detected. 它让我参考 VisualVM 故障排除指南以获取更多信息和解决问题的步骤。
  • 这可能不是临时目录的正确路径。启动应用程序时,如果启动Java时还包含-Djava.io.tmpdir=[Same place],则两个文件夹必须匹配,JVisualVM必须能够看到内容。
  • 我在linux上也遇到了类似的问题。就我而言,我在与正在运行的 java 进程不同的组下运行 jvisualvm。但同样的根本问题 - 无法访问java.io.tmpdir
【解决方案3】:

Mikaveli、Kuba 和 Somaiah Kumbera 提供了出色的解决方案。只需添加我所做的工作即可使事情正常进行。

我首先检查了位置 C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'

没有以我在 Eclipse 中运行的程序的进程 ID 命名的文件。

我只是停止了程序并将以下参数添加到程序的运行配置中(运行配置 -> 参数 -> VM 参数

-Djava.io.tmpdir=C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'

我又开始了这个程序。仍然无法对其进行分析。但是现在我在给定的临时目录中为该进程创建了一个文件。

然后,简单地重新启动 VisualVM 就可以了。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,但有以下症状:

    我启动了码头,工作目录在 C:\Users\t852124\AppData\Local\Temp

    Jetty 正在创建 hsperfdata_ 目录,但未在其中设置 processID

    所以当我启动visualVM时,它无法获取任何java进程信息。

    我通过使用 -Djava.io.tmpdir=C:/temp/java 选项启动码头解决了这个问题。

    现在,当我启动 jetty 时,进程 ID 被创建为 hsperfdata_ 目录中的文件。 所以当我启动visualVM时,它能够看到我本地的java进程

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,使用提升的权限(管理员权限)运行 VisualVM 解决了这个问题。

      【讨论】:

      • 我可以确认,这就是让 Eclipse 至少可以在 Windows 10 中使用 VisualVM 进行分析的原因。
      【解决方案6】:

      在带有 VisualVM 1.3.3 的 Linux 上,我必须删除 ~/.visualvm/1.3.3/ 中应用程序的本地设置才能启用 CPU Profiler 和 CPU Sampler。

      另请注意,/usr/bin/jvisualvm 包含 OpenJDK 的硬编码路径(使用 jdkhome 变量设置),与运行到 Oracle JDK 1.7 相比,这似乎会导致很多问题。

      【讨论】:

        【解决方案7】:

        另外请注意,如果您的应用程序使用的是最新的非 Oracle JVM,您可能需要下载 "bleeding edge" VisualVM from github

        例如,与 JDK 1.8.0.111 捆绑的 VisualVM 似乎不适用于 IBM 1.8 JVM。可能 IBM JVM 只是在 Oracle 1.8 JVM 之后发布的,因此当时不可能进行必要的更改。

        【讨论】:

          猜你喜欢
          • 2012-05-22
          • 2015-01-29
          • 2013-12-29
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          • 2014-05-24
          相关资源
          最近更新 更多