当从VisualVM通过JMX远程连接到JBoss AS时,如何避免此NullPointerException?

时间:2012-01-25 03:18:20

标签: java profiling nullpointerexception jmx visualvm

问题:

当我通过VisualVM连接并提供正确的凭据时,程序似乎等待了一些(处理或等待连接),然后出现异常错误。在抛出此异常后,似乎没有正确添加连接:

java.lang.NullPointerException: Illegal null argument
    at javax.management.remote.JMXConnectionNotification.<init>(JMXConnectionNotification.java:152)
    at javax.management.remote.rmi.RMIConnector$RMIClientCommunicatorAdmin.gotIOException(RMIConnector.java:1444)
    at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.isInstanceOf(RMIConnector.java:1062)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.tools.visualvm.jmx.impl.JmxModelImpl$CheckerInvocationHandler.invoke(JmxModelImpl.java:598)
    at $Proxy7.isInstanceOf(Unknown Source)
    at java.lang.management.ManagementFactory.newPlatformMXBeanProxy(ManagementFactory.java:616)
    at com.sun.tools.visualvm.tools.jmx.JvmMXBeansFactory$JvmMXBeansImpl.getMXBean(JvmMXBeansFactory.java:383)
    at com.sun.tools.visualvm.tools.jmx.JvmMXBeansFactory$JvmMXBeansImpl.getRuntimeMXBean(JvmMXBeansFactory.java:356)
    at com.sun.tools.visualvm.jmx.impl.JmxApplication.getPid(JmxApplication.java:84)
    at com.sun.tools.visualvm.jvmstat.JvmstatModelProvider.getMonitoredVm(JvmstatModelProvider.java:49)
    at com.sun.tools.visualvm.jvmstat.JvmstatModelProvider.createModelFor(JvmstatModelProvider.java:71)
    at com.sun.tools.visualvm.jvmstat.JvmstatModelProvider.createModelFor(JvmstatModelProvider.java:45)
    at com.sun.tools.visualvm.core.model.ModelFactory.getModel(ModelFactory.java:111)
    at com.sun.tools.visualvm.tools.jvmstat.JvmstatModelFactory.getJvmstatFor(JvmstatModelFactory.java:65)
    at com.sun.tools.visualvm.jvm.JRockitJvmProvider.createModelFor(JRockitJvmProvider.java:49)
    at com.sun.tools.visualvm.jvm.JRockitJvmProvider.createModelFor(JRockitJvmProvider.java:42)
    at com.sun.tools.visualvm.core.model.ModelFactory.getModel(ModelFactory.java:111)
    at com.sun.tools.visualvm.application.jvm.JvmFactory.getJVMFor(JvmFactory.java:65)
    at com.sun.tools.visualvm.jmx.impl.JmxApplicationProvider.addJmxApplication(JmxApplicationProvider.java:292)
    at com.sun.tools.visualvm.jmx.impl.JmxApplicationProvider.access$100(JmxApplicationProvider.java:73)
    at com.sun.tools.visualvm.jmx.impl.JmxApplicationProvider$3$1.run(JmxApplicationProvider.java:408)
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1424)
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:1968)

背景

我正在使用VisualVM进行一些简单的分析工作。我在Windows上运行jboss-4.2.2.GA。

在我的run.bat文件中,我有:

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=<myport>
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.local.only=false
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=false

在我创建的JMX密码文件中,我启用了具有只读访问权限的角色,并确保在该文件上正确设置了读访问权。

我可以通过JMX连接到localhost:<myport>上的服务器。用户名和密码与我的JMX密码配置文件中的角色和密码匹配。使用不同的凭据或不同的密码不起作用,所以这肯定是正确设置的。

我已在我的域中为java.exe设置了常规防火墙例外。当我没有这个例外时,我根本无法连接到服务器。当我启用它时,我可以通过telnet远程连接到myport,当我尝试通过VisualVM远程连接时,我得到一个密码对话框。

我尝试查看异常堆栈跟踪中引用的代码。据我所知,构建connectionIdnull可能是JMXConnectionNotification。我不知道为什么,因为我没有费心试图在调试器中运行它。

我有没有错误配置?我如何通过此错误?


编辑:

我刚试过用JConsole远程连接,我得到一个完全不同的错误:

java.rmi.ConnectException: Connection refused to host: 127.0.0.1;

我的客户端计算机上的hosts文件中没有任何条目,因为网上的某些内容已经建议WRT出现此错误。这表明存在不同的问题,还是相关的?

2 个答案:

答案 0 :(得分:2)

在我们的例子中,设置以下属性很有帮助:

set JAVA_OPTS=%JAVA_OPTS% -Djava.rmi.server.hostname=192.168.1.2

其中192.168.1.2是受监控服务器的实际IP地址。

答案 1 :(得分:0)

这些是我在run.bat中的条目,它运行正常。可能缺少authenticate = true导致问题。

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=<myport>
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=true
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=false