什么原因导致“java.lang.IncompatibleClassChangeError:vtable存根”?
什么原因导致“java.lang.IncompatibleClassChangeError:vtable存根”?在我们的应用程序中,我们发现这个错误是随机弹出的,很少出现(到目前为止只有两次,而且我们运行了很多)。即使重新启动应用程序,使用相同的jvm/jar而不重建也不容易重现。什么原因导致“java.lang.IncompatibleClassChangeError:vtable存根”?
至于我们的构建过程,我们清理所有的类/ jar并重建它们,所以它与其他人遇到的问题并不是同一个问题,他们在一个类中进行了更改,并且没有重新编译其他相关类。
这不像其他一些与IncompatibleClassChangeError有关的问题 - 他们都没有提到“vtable stub”。事实上,当搜索“IncompatibleClassChangeError”vtable stub“”时,出现了惊人的谷歌搜索结果。
编辑:
- 使用JDK 1.6.0_16。
- 我们不使用Java序列化。
- 我们不在做字节码操作。
- 如前所述,我们正在做一个“干净的构建”,所以没有以前的构建遗留的类。
看起来你已经改变了类定义(即增加了一个额外的属性或更奇怪的东西),并且在运行先前使用的对象时变得不兼容。
也许你正在某处存储对象实例(一个数据库文件系统),然后这些旧的对象定义被解组,那么会发生错误。
它发生在我身上。
例如:
class Employee implements Serialiable {
String name;
String lastName;
String address;
... etc
}
应用程序工作了几个星期,一些对象存储在它的序列化版本的文件系统。
后来由于应用程序的变化,我们必须地址添加为一个对象:
class Employee implements Serializable {
String name;
String lastName;
Address address;
}
然后预先存储的对象被重建,并试图让他们适应这个新的描述,该错误可能提高(在我的情况下,它比这复杂得多),但它可以帮助你朝这个方向看。
JVM字节码世界中的ABI中断。查找Javadoc: “当某个类定义发生不兼容的类更改时抛出。当前正在执行的方法所依赖的某个类的定义已经发生了变化。“
寻找的元凶是静态最终文字值的更改,因为它们被作为”优化“复制到字节代码中。编辑:这可以像库升级的结果一样简单,我知道的唯一修复是干净的重建。
听起来像你可能有损坏的类文件。你在开发/构建/部署什么系统?你使用什么Java版本?你在使用字节码操作工具吗? – Jesper 2010-06-14 21:25:46
您使用的是什么JVM?我发现JDK7中提到了这个错误。 – 2010-06-14 21:31:22