java - NoClassDefFoundError "wrong name"对于 java.lang 包中的类

标签 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)

在此堆栈跟踪中,错误发生在 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)
    [...]

还有

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)
    [...]

所以它不仅发生在类初始化期间,而且在我收集的少数样本中,反射实现中的某些东西似乎确实是罪魁祸首。

Java 是第 8 版

java version "1.8.0_144"

nodetool 启动器始终使用相同的类路径。而且那里没有奇怪的类(或其他类加载器)。相同的安装在数百个相同的节点上完成(在 Linux 上)。

我对 NoClassDefFoundError wrong name 的热门搜索结果是指使用简化类名而不是完全限定名启动 java 的执行。这不是这里的问题。此外,错误消息中的名称是相同的。

那么什么会导致“ Bootstrap ”类出现这样的“错误名称”NoClassDefFoundError 错误?

最佳答案

我认为是资源不足导致了诸如连接器超时之类的问题。您看到示例中的日志了吗? nodeprobe 是通过 jmx 连接还是尝试连接然后发生错误? 这些是非常典型的错误,也可能导致其他间歇性错误。(通常是 OS/netowrk OS shit)因此: 包括您的字符串甚至基于对象的错误;总而言之,这是有道理的。 可能是您应该在错误发生时检查您的资源。 我知道这是资源监视器导致资源不足的第 22 个陷阱;但它发生了嘿嘿

关于java - NoClassDefFoundError "wrong name"对于 java.lang 包中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46943865/

相关文章:

java - 设计问题: Should UI layer worry about it's backend?

java - 如果pdf是从java代码生成的,如何解决损坏的pdf文件?

php - PHP 中的模拟 exit() 函数

Java:如何在不知道包名称的情况下扫描类?

java - 如果 @Configuration 类包含不可解析的类引用,Spring 如何调用 @Bean 方法

java - 检索每个文档 Neo4j Lucene 的分数,而不仅仅是顺序

java - 在 Vaadin 中的多个用户/ session /UI 之间共享一组只读表数据

java - 无法使用 java 中的反射调用带有变量参数的方法

java - 注释 SOURCE 保留政策

java - 如何使用Java中的部署文件夹中的反射类加载来获取带有前缀包的子类?