2010-06-14 300 views
4

什么原因导致“java.lang.IncompatibleClassChangeError:vtable存根”?在我们的应用程序中,我们发现这个错误是随机弹出的,很少出现(到目前为止只有两次,而且我们运行了很多)。即使重新启动应用程序,使用相同的jvm/jar而不重建也不容易重现。什么原因导致“java.lang.IncompatibleClassChangeError:vtable存根”?

至于我们的构建过程,我们清理所有的类/ jar并重建它们,所以它与其他人遇到的问题并不是同一个问题,他们在一个类中进行了更改,并且没有重新编译其他相关类。

这不像其他一些与IncompatibleClassChangeError有关的问题 - 他们都没有提到“vtable stub”。事实上,当搜索“IncompatibleClassChangeError”vtable stub“”时,出现了惊人的谷歌搜索结果。

编辑:

  • 使用JDK 1.6.0_16。
  • 我们不使用Java序列化。
  • 我们不在做字节码操作。
  • 如前所述,我们正在做一个“干净的构建”,所以没有以前的构建遗留的类。
+1

听起来像你可能有损坏的类文件。你在开发/构建/部署什么系统?你使用什么Java版本?你在使用字节码操作工具吗? – Jesper 2010-06-14 21:25:46

+0

您使用的是什么JVM?我发现JDK7中提到了这个错误。 – 2010-06-14 21:31:22

回答

0

看起来你已经改变了类定义(即增加了一个额外的属性或更奇怪的东西),并且在运行先前使用的对象时变得不兼容。

也许你正在某处存储对象实例(一个数据库文件系统),然后这些旧的对象定义被解组,那么会发生错误。

它发生在我身上。

例如:

class Employee implements Serialiable { 
    String name; 
    String lastName; 
    String address; 
    ... etc 
} 

应用程序工作了几个星期,一些对象存储在它的序列化版本的文件系统。

后来由于应用程序的变化,我们必须地址添加为一个对象:

class Employee implements Serializable { 
    String name; 
    String lastName; 
    Address address; 
} 

然后预先存储的对象被重建,并试图让他们适应这个新的描述,该错误可能提高(在我的情况下,它比这复杂得多),但它可以帮助你朝这个方向看。

1

JVM字节码世界中的ABI中断。查找Javadoc: “当某个类定义发生不兼容的类更改时抛出。当前正在执行的方法所依赖的某个类的定义已经发生了变化。“

寻找的元凶是静态最终文字值的更改,因为它们被作为”优化“复制到字节代码中。编辑:这可以像库升级的结果一样简单,我知道的唯一修复是干净的重建。

相关问题