5

是什么导致“java.lang.IncompatibleClassChangeError: vtable stub”?在我们的应用程序中,我们看到这个错误随机弹出并且非常少见(到目前为止只有两次,而且我们经常运行它)。即使重新启动应用程序,使用相同的 jvm/jars 而不重新构建,它也不容易重现。

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

这与其他一些与 IncompatibleClassChangeError 相关的问题不同——它们都没有提到“vtable stub”。事实上,在搜索“IncompatibleClassChangeError "vtable stub"”时,谷歌搜索结果出奇地少。

编辑:

  • 使用 JDK 1.6.0_16。
  • 我们没有使用 Java 序列化。
  • 我们不是在做字节码操作。
  • 如前所述,我们正在进行“干净的构建”,因此之前的构建没有遗留任何类。
4

2 回答 2

2

JVM 字节码世界中的 ABI 破坏。查找 Javadoc:“当某些类定义发生不兼容的类更改时抛出。当前执行的方法所依赖的某个类的定义已经改变。”</p>

要寻找的罪魁祸首是静态最终文字值的更改,因为这些在字节码中被复制为“优化”。编辑:这可以像库升级一样简单,我知道的唯一修复是干净的重建。

于 2010-06-14T21:30:02.917 回答
0

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

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

过去发生在我身上。

例如:

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

该应用程序工作了几个星期,并且一些对象以其序列化版本存储在文件系统中。

后来由于应用程序更改,我们必须将地址添加为对象:

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

然后重构先前存储的对象并尝试使它们适合这个新描述,该错误可能会引发(在我的情况下它比这复杂得多)但它可能会帮助您朝那个方向看。

于 2010-06-14T21:29:38.113 回答