我想设置两个运行jstatd的服务器,这样我就可以实时监控我的应用程序。web服务器已经启动并运行,但另一台服务器总是会出现这样的异常。
无法将/JStatRemoteHost绑定到RMI注册表java.rmi.ServerException:服务器线程中发生RemoteException;嵌套异常为:java.rmi.UnmarshalException:error解组论点;嵌套异常为:java.lang.ClassNotFoundException:sun.jvmstat.monitor.remote.RemoteHost(无安全管理器:RMI类加载程序已禁用)sun.rmi.server.UnincastServerRef.oldDispatch(UnicastServerRef.java:419)在sun.rmi.server.UnincastServerRef.dispatch(UnicastServerRef.java:267)在sun.rmi.transport.transport$1.run(transport.java:177)sun.rmi.transport.transport$1.run(transport.java:174)位于的java.security.AccessController.doPrivileged(本机方法)sun.rmi.transport.transport.serviceCall(transport.java:173)位于sun.rmi.transport.tcp.TCPTransport.handleMessage(TCPTransport.java:553)在sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)在sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)在java.util.concurrent.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.java:1145)在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java:722)sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)在sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)位于sun.rmi.server.UnincastRef.ioke(UnicastRef.java:377)位于的sun.rmi.registery.RegistryImpl_Stub.rebind(未知源)java.rmi.Namining.rebind(Naming.java:177)位于sun.tools.jstatd.jstatd.bind(jstatd.java:57)sun.tools.jstatd.jstatd.main(jstatd.java:143)原因:java.rmi.UnmarshalException:解组参数时出错;嵌套的异常为:java.lang.ClassNotFoundException:sun.jvmstat.monitor.remote.RemoteHost(无安全管理器:RMI类加载程序已禁用)位于的sun.rmi.registry.RegistryImpl_ske.dispatch(未知源)sun.rmi.server.UnincastServerRef.oldDispatch(UnicastServerRef.java:409)在sun.rmi.server.UnincastServerRef.dispatch(UnicastServerRef.java:267)在sun.rmi.transport.transport$1.run(transport.java:177)sun.rmi.transport.transport$1.run(transport.java:174)位于的java.security.AccessController.doPrivileged(本机方法)sun.rmi.transport.transport.serviceCall(transport.java:173)位于sun.rmi.transport.tcp.TCPTransport.handleMessage(TCPTransport.java:553)在sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)在sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)在java.util.concurrent.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.java:1145)在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java:722)由以下原因引起:java.lang.ClassNotFoundException:sun.jvmstat.monitor.remote.RemoteHost(无安全管理器:RMI类加载程序已禁用)sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:554)在java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)在java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)在sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:263)在java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1556)在java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1512)在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769)位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)…还有13个
我确信jstatd加载了内容为的策略文件
授予代码库"file:${java.home}/../lib/tools.jar"{权限java.security.AllPermission;};
我不知道问题出在哪里,请帮忙。
我遇到了和你一样的问题。
据我所知,异常发生在rmi注册表端,因为它找不到tools.jar内的类sun.jvmstat.monitor.remote.RemoteHost。
在我的案例中,解决方案是在启动rmiregistry时指定java.rmi.server.codebase属性。在指定了代码库属性之后,问题就消失了。请尝试使用以下Linux/Solaris命令启动rmiregistry:
rmiregistry-J-Djava.rmi.server.codebase=文件:${java.home}/../lib/tools.jar;
或者适用于Windows(尽管我没有完全测试)
启动rmiregistry-J-Djava.rmi.server.codebase="%JAVA_HOME%/../lib/tools.jar"
希望它能帮助你。