我有一个Java应用程序,我想使用Java VisualVM(jvisualvm
)监视它。
但是,在VisualVM窗口中可以看到很少的数据。另外,我不能进行堆转储。
以下是我写的另一个测试应用程序的截图:
我可以监视内存使用情况,加载的类和线程。堆转储,执行GC以及取样都被禁用。
我已尝试将-Dcom.sun.management.jxmremote
添加到VM参数,如here所述。这将显示在“安装详细信息”窗口中。但是,它不会出现在Java进程参数中。 (应该吗?)
我还尝试点击测试应用中的按钮,直到OutOfMemoryError
发生。没有堆转储;因为OOME上的堆转储已被禁用,这并不奇怪。
我该怎么做才能解决这个问题?
答案 0 :(得分:3)
我遇到了这个问题,因为我从与目标进程不同的JRE / JDK安装运行JVisualVM。似乎两者必须来自同一个地方,或者它会使堆转储按钮变灰。
答案 1 :(得分:2)
似乎不同的Java版本存在问题。
长话短说:如果JDK过时,请重新安装,并从C:\Windows\System32
和C:\Windows\SysWOW64
删除Java可执行文件。
首先,我想告诉你我的计算机上有多个版本的Java。我的JDK是32位的,因为有些驱动程序没有运行64位Java。此外,我安装了32位和64位JRE,后者为Java游戏提供了更好的性能。
我的JDK是版本7,更新40. VisualVM也是那个版本。但是,我的自动更新JRE是版本7,更新45。
java -version
告诉我它是版本45(它是),所以我没有想到问题就在那里。
然后,我通过控制面板检查了版本。我现在知道我的JDK已经过时了,所以我卸载它并重新加载它。
从系统路径中卸载已删除的Java,因此jvisualvm
将无法运行。我把它添加到路径中。现在app和VisualVM都正常运行,但问题仍然存在。
最后一个问题是系统使用的是来自java.exe
的{{1}}而不是JDK的C:\Windows\System32
。到目前为止它似乎是最新的,但可能是JRE安装在与VisualVM(= JDK)不同的位置。
最后,我刚刚删除了C:\Windows\System32
和C:\Windows\SysWOW64
中的Java可执行文件。