2010-06-14 289 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: 「當某個類定義發生不兼容的類更改時拋出。當前正在執行的方法所依賴的某個類的定義已經發生了變化。「

尋找的元兇是靜態最終文字值的更改,因爲它們被作爲」優化「複製到字節代碼中。編輯:這可以像庫升級的結果一樣簡單,我知道的唯一修復是乾淨的重建。

相關問題