为什么VisualVM Profiler不会配置我的应用程序?
我创建了一个简单的1文件java应用程序,它循环遍历循环,调用一些函数,分配一些内存,添加一些数字等。我通过eclipse的Run As->Java Application
运行该应用Run As->Java Application
。
正在运行的应用程序显示在Local
Visual Basic下的Java VisualVM中。
我双击该应用程序并转到Profiler选项卡。
默认设置为:
Start profiling from classes: my.main.package.**
Do not profile classes: java.*, javax.*, sun.*, sunw.*, com.sun.*
我点击CPU
。 CPU
和Memory
按钮变灰。 什么都没发生。
Status
表示profiling inactive
。
当我的应用程序终止时, Status
表示application terminated
。
我在这做错了什么? 我需要调整一些设置吗? 启动应用程序时是否需要设置VM标志?
我猜这个问题与从Eclipse中启动的应用程序有关,这是因为JVisualVM希望在java.io.tmpdir
目录中找到数据(通常是C:\Users\[your username]\AppData\Local\Temp\hsperfdata_[your username]
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
文件夹,请尝试以通常的命令行Java方式在Eclipse外运行应用程序。
另请注意,在1.6.0_23周围引入了一个影响临时文件夹(区分大小写)的错误,所以也许您可以通过更新到更新的Java 6(或7)版本来获益?
java 1.7.0_45更新后我遇到了同样的问题。 我不得不删除以下文件夹:
C:\users\'username'\AppData\Local\Temp\hsperfdata_'username'
在这样做之后,一切都像魅力一样。
我有同样的问题,但有以下症状:
我启动了jetty,工作目录位于C:\ Users \ t852124 \ AppData \ Local \ Temp
Jetty正在创建hsperfdata_目录,但没有在其中设置processID
因此,当我启动visualVM时,它无法获取任何java进程信息。
我通过使用-Djava.io.tmpdir = C:/ temp / java选项启动jetty来解决这个问题。
现在,当我启动jetty时,进程ID在hsperfdata_目录中创建为文件。 因此,当我启动visualVM时,它能够看到我的本地java进程
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就可以了。
在使用VisualVM 1.3.3的Linux上,我必须删除~/.visualvm/1.3.3/
的应用程序的本地设置以启用CPU Profiler和CPU Sampler。
另请注意,/ usr / bin / jvisualvm包含OpenJDK的硬编码路径(使用jdkhome
变量设置),与运行Oracle JDK 1.7相比,这似乎会导致很多问题。
我遇到了同样的问题,并且使用提升的权限(管理员权限)运行VisualVM解决了这个问题。
另请注意,如果您的应用程序使用的是最近的非Oracle JVM,则可能需要从github下载“前沿”VisualVM 。
例如,与JDK 1.8.0.111捆绑在一起的VisualVM似乎不适用于IBM 1.8 JVM。 IBM JVM可能只是在Oracle 1.8 JVM之后发布,因此当时无法进行必要的更改。