无法在VisualVM中打开某些应用程序

6

我正在使用Ubuntu 14.04和Oracle JDK 8,想要使用VisualVM检查我的应用程序的性能。我可以检查其他应用程序,如JDownloader,但我不能检查自己的应用程序和Eclipse 4.3。在进行Ubuntu的新安装之前,我使用的是JDK 7,并且没有任何配置问题。它会提供以下日志:

SEVERE [org.openide.util.RequestProcessor]: Error in RequestProcessor com.sun.tools.visualvm.core.ui.DataSourceWindowManager$1
java.lang.IllegalArgumentException: Unexpected composite type for ThreadInfo
    at sun.management.ThreadInfoCompositeData.validateCompositeData(ThreadInfoCompositeData.java:372)
    at sun.management.ThreadInfoCompositeData.getInstance(ThreadInfoCompositeData.java:68)
    at java.lang.management.ThreadInfo.<init>(ThreadInfo.java:263)
    at java.lang.management.ThreadInfo.from(ThreadInfo.java:794)
Caused: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$CompositeBuilderViaFrom.fromCompositeData(DefaultMXBeanMappingFactory.java:1018)
Caused: java.io.InvalidObjectException: Failed to invoke from(CompositeData)
    at com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.invalidObjectException(DefaultMXBeanMappingFactory.java:1457)
    at com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$CompositeBuilderViaFrom.fromCompositeData(DefaultMXBeanMappingFactory.java:1021)
    at com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$CompositeMapping.fromNonNullOpenValue(DefaultMXBeanMappingFactory.java:919)
    at com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$NonNullMXBeanMapping.fromOpenValue(DefaultMXBeanMappingFactory.java:133)
    at com.sun.jmx.mbeanserver.ConvertingMethod.fromOpenReturnValue(ConvertingMethod.java:131)
    at com.sun.jmx.mbeanserver.MXBeanProxy.invoke(MXBeanProxy.java:168)
    at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:252)
Caused: java.lang.reflect.UndeclaredThrowableException
    at com.sun.proxy.$Proxy8.getThreadInfo(Unknown Source)
    at com.sun.tools.visualvm.jmx.impl.JmxSupport.isReadOnlyConnection(JmxSupport.java:95)
    at com.sun.tools.visualvm.jmx.impl.JmxModelImpl.isTakeThreadDumpSupported(JmxModelImpl.java:311)
    at com.sun.tools.visualvm.application.views.threads.ApplicationThreadsViewProvider.resolveThreads(ApplicationThreadsViewProvider.java:65)
    at com.sun.tools.visualvm.application.views.threads.ApplicationThreadsViewProvider.supportsViewFor(ApplicationThreadsViewProvider.java:29)
    at com.sun.tools.visualvm.application.views.threads.ApplicationThreadsViewProvider.supportsViewFor(ApplicationThreadsViewProvider.java:25)
    at com.sun.tools.visualvm.core.ui.DataSourceViewsManager.getViews(DataSourceViewsManager.java:116)
    at com.sun.tools.visualvm.core.ui.DataSourceWindowManager.openWindowAndAddView(DataSourceWindowManager.java:169)
    at com.sun.tools.visualvm.core.ui.DataSourceWindowManager.access$000(DataSourceWindowManager.java:30)
    at com.sun.tools.visualvm.core.ui.DataSourceWindowManager$1.run(DataSourceWindowManager.java:80)
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1393)
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2005)

JVisualVM 也能在 Java 8 上运行吗? - Holger
@Holger 它包含在JDK 8中。 - serdar
嗯,奇怪。不幸的是,我无法在这里重现它... - Holger
我时间有限,所以我在另一台安装了JDK 7的计算机上对我的代码进行了分析。但是这个问题应该保持开放状态,以便有人可以在未来解决它。 - serdar
3个回答

6
您应该在与您的应用程序相同的JDK版本上运行visualvm,查看帮助->关于->详细信息(Java),我的版本令人惊讶地是jdk8而不是jdk13(我都有),因此您可以手动为visualvm设置JDK版本,方法是编辑etc/visualvm.conf文件,取消注释并设置参数。
visualvm_jdkhome=C:\Program Files\Java\jdk-13

5

运行 Eclipse 和应用程序时使用 JVM 参数 -Duser.language=en -Duser.country=us ...
然后您将能够使用 jvisualvm 进行分析。

对于 Eclipse,请在 eclipse.ini 中添加这两行。

-Duser.language=en
-Duser.country=us

也许你预装的Ubuntu语言设置为英语,之前没有问题。

这解决了我在对本地Wildfly实例进行分析时无法采样CPU的问题,但我很好奇为什么恰恰是这些参数导致了这个问题。我们正在维护一个多语言系统,容器依赖于这些属性,改变参数以便我们可以分析某些函数调用并不太合理。 - felace
2
没有解决我的问题 :/ 在 Windows 机器上运行 - Snurka Bill

0
对于使用Windows和IDE插件的用户,我成功解决问题的方法如下:
1. 从你的IDE启动进程和VisualVM -> 过了一段时间后,会弹出错误提示"无法打开应用程序..."。
2. 然后,在VisualVM中手动选择该进程并尝试连接。 -> 一个Windows对话框弹出,询问是否允许连接到Java进程。
3. 确认允许连接到该进程。 -> 现在应该可以正常工作了。
我猜测Windows安全对话框可能被VisualVM忽略或屏蔽了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接