是什么导致“java.lang.IncompatibleClassChangeError:vtable stub”?

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

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

这与IncompatibleClassChangeError相关的其他一些问题不同 – 它们都没有提到“vtable stub”。 事实上,在搜索“IncompatibleClassChangeError”vtable stub“”时,谷歌搜索结果令人惊讶。

编辑:

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

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

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

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

也许你正在某处存储对象实例(db文件系统)然后解组那些旧对象定义,就会发生错误。

它过去发生在我身上。

例如:

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

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

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

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

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