5

「java.lang.IncompatibleClassChangeError: vtable stub」の原因は何ですか? 私たちのアプリケーションでは、このエラーがランダムに表示されることはほとんどありません (これまでに 2 回だけで、何度も実行しています)。アプリを再起動しても、再構築せずに同じ jvm/jar を使用しても、すぐには再現できません。

ビルド プロセスに関しては、すべてのクラス/jar をクリーンアップして再構築するため、あるクラスに変更を加えて他の依存クラスを再コンパイルしなかった場合に他の人が遭遇した問題とは異なります。

これは、IncompatibleClassChangeError に関連する他のいくつかの質問とは異なります。「vtable スタブ」について言及しているものはありません。実際、「IncompatibleClassChangeError "vtable stub"」で検索すると、Googleで検索結果が驚くほど少ないです。

編集:

  • JDK 1.6.0_16 を使用。
  • Java シリアライゼーションは使用していません。
  • バイトコード操作は行っていません。
  • 前述のとおり、「クリーン ビルド」を行っているため、以前のビルドから残っているクラスはありません。
4

2 に答える 2

2

JVM バイトコードの世界での ABI の破損。Javadoc を参照してください。現在実行中のメソッドが依存するクラスの定義が変更されました。」</p>

探すべき原因は、静的な最終リテラル値への変更です。これは、これらが「最適化」としてバイト コードにコピーされるためです。編集:これは、ライブラリのアップグレードの結果と同じくらい簡単な場合があります。私が知っている唯一の修正は、クリーンな再構築です。

于 2010-06-14T21:30:02.917 に答える
0

クラス定義を変更したように見えます (つまり、余分な属性を追加するか、より奇妙なものを追加します)。以前に使用したオブジェクトを実行すると、互換性がなくなります。

おそらく、オブジェクトインスタンスをどこかに保存していて (ファイルシステムの db )、それらの古いオブジェクト定義が非整列化されていると、エラーが発生します。

それは過去に私に起こりました。

例えば:

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 に答える