是什么原因导致“ java.lang.IncompatibleClassChangeError:vtable存根”?

Jim*_*imN 5 java runtime vtable

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

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

这与与IncompatibleClassChangeError相关的其他一些问题不同-他们都没有提到“ vtable stub”。实际上,搜索“ IncompatibleClassChangeError“ vtable stub”“时,谷歌搜索结果很少。

编辑:

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

Osc*_*Ryz 0

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

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

这件事过去发生在我身上。

例如:

class Employee implements Serialiable {
   String name;
   String lastName;
   String address;
   ... etc 
}
Run Code Online (Sandbox Code Playgroud)

该应用程序运行几周,一些对象以其序列化版本存储在文件系统中。

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

class Employee implements Serializable {
   String name;
   String lastName;
   Address address;
 }
Run Code Online (Sandbox Code Playgroud)

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