Sav*_*ior 11 java reflection classloading
我在主机上运行Cassandra 2.2.11(并且不会升级).我在cron作业中定期运行nodetool命令进行监控.nodetool实现为另一个使用JMX与Cassandra java进程通信的java进程.我每分钟发出五个左右的命令.
偶尔(不是任何可识别的模式),执行nodetool将失败NoClassDefFoundError,引用类来自java.lang.例如,
java.lang.NoClassDefFoundError: java/lang/Thread (wrong name: java/lang/Thread)
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
at java.lang.Class.getDeclaredField(Class.java:2068)
at java.util.concurrent.FutureTask.<clinit>(FutureTask.java:476)
at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleWithFixedDelay(ScheduledThreadPoolExecutor.java:590)
at sun.rmi.transport.tcp.TCPChannel.free(TCPChannel.java:347)
at sun.rmi.server.UnicastRef.free(UnicastRef.java:431)
at sun.rmi.server.UnicastRef.done(UnicastRef.java:448)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:132)
at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:205)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1955)
at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1922)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:287)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270)
at org.apache.cassandra.tools.NodeProbe.connect(NodeProbe.java:183)
at org.apache.cassandra.tools.NodeProbe.<init>(NodeProbe.java:150)
at org.apache.cassandra.tools.NodeTool$NodeToolCmd.connect(NodeTool.java:302)
at org.apache.cassandra.tools.NodeTool$NodeToolCmd.run(NodeTool.java:242)
at org.apache.cassandra.tools.NodeTool.main(NodeTool.java:158)
Run Code Online (Sandbox Code Playgroud)
在此堆栈跟踪中,错误发生在类初始化期间FutureTask.我也见过
java.lang.NoClassDefFoundError: java/lang/Object (wrong name: java/lang/Object)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethod(Class.java:2128)
at java.lang.invoke.MethodHandleImpl$Lazy.<clinit>(MethodHandleImpl.java:614)
[...]
Run Code Online (Sandbox Code Playgroud)
但是也
java.lang.NoClassDefFoundError: java/lang/String (wrong name: java/lang/String)
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
at java.lang.Class.getDeclaredField(Class.java:2068)
at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1703)
at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:72)
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:484)
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:472)
[...]
Run Code Online (Sandbox Code Playgroud)
所以它不仅发生在类初始化期间,而且,在我收集的少量样本中,反射实现中的某些东西似乎确实是罪魁祸首.
Java版本为8
java version "1.8.0_144"
Run Code Online (Sandbox Code Playgroud)
该nodetool发射器总是使用相同的类路径.并且没有奇怪的类(或其他类加载器).在数百个相同的节点上(在Linux上)完成相同的安装.
我的热门搜索结果是NoClassDefFoundError wrong name指使用简化的类名来启动的执行java,而不是完全限定的名称.这不是问题所在.此外,错误消息中的名称是相同的.
那么什么会导致NoClassDefFoundError"bootstrap"类的"错误名称" 错误?
小智 1
我认为是缺乏资源导致了连接器超时等问题。您看到示例中的日志了吗?nodeprobe正在通过jmx连接或尝试连接然后发生错误?这些是非常典型的错误,也可能导致其他间歇性错误。(通常是操作系统/网络操作系统)因此:包括您的字符串甚至基于对象的错误;总之这是有道理的。发生错误时,您可能应该检查您的资源。我知道这是第 22 条陷阱,资源监视器导致资源缺乏;但它发生了呵呵