2010-06-14 3 views
4

"java.lang.IncompatibleClassChangeError : vtable stub"의 원인은 무엇입니까? 우리의 응용 프로그램에서는이 오류가 무작위로 그리고 매우 드물게 (단지 두 번까지 지금까지 우리가 많이 실행했음을) 보았습니다. 다시 빌드하지 않고 동일한 jvm/jar를 사용하여 응용 프로그램을 다시 시작할 때조차도 쉽게 재현 할 수 없습니다."java.lang.IncompatibleClassChangeError : vtable stub"의 원인은 무엇입니까?

빌드 과정에서 모든 클래스/jar를 지우고 다시 빌드하므로 한 클래스에서 변경 한 위치와 다른 종속 클래스를 다시 컴파일하지 않은 다른 사용자와 동일한 문제가 아닙니다.

이것은 IncompatibleClassChangeError와 관련된 다른 질문과는 달리 "vtable 스텁"에 대한 언급이 없습니다. 사실 "IncompatibleClassChangeError"vtable 스텁 "을 검색 할 때 놀랍게도 Google 검색 결과가 거의 없습니다.

편집 : JDK 1.6.0_16을 사용하여

  • .
  • Java 직렬화를 사용하지 않습니다.
  • 바이트 코드 조작을 수행하지 않습니다.
  • 앞서 언급했듯이 "클린 빌드"를 수행 중이므로 이전 빌드에서 남은 클래스가 없습니다.
+1

클래스 파일이 손상되었을 수 있습니다. 어떤 시스템을 개발/구축/전개하고 있습니까? 어떤 Java 버전을 사용하고 있습니까? 바이트 코드 조작 도구를 사용하고 있습니까? – Jesper

+0

어떤 JVM을 사용하고 있습니까? JDK7에서이 문제를 언급 한 버그를 발견했습니다. –

답변

0

클래스 정의를 변경 (예 : 추가 속성 또는 더 이상한 것을 추가) 한 것처럼 보이며 이전에 사용한 개체를 실행할 때 호환되지 않습니다.

아마도 어딘가에 객체 인스턴스를 저장하고 (db 파일 시스템) 그 오래된 객체 정의가 비 정렬 화되면 오류가 발생합니다.

과거에 나에게 일어난 일입니다. 예를 들어

:

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

응용 프로그램은 주 동안 작동하고 일부 개체는 직렬화 된 버전의 파일 시스템에 저장됩니다.

나중에 인해 응용 프로그램 변경 우리가 객체로 주소를 추가해야합니다 : 그들이이 새로운 기술에 적합하게 구성되어

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

이전에 저장된 객체를 재구성하고, 시도, 그 오류 raise (필자의 경우 이보다 훨씬 복잡했다.) 그러나 그 방향을 살펴 보는 것이 도움이 될 수있다.

1

JVM 바이트 코드 세계에서 ABI가 손상되었습니다. Javadoc : "일부 클래스 정의에 호환되지 않는 클래스 변경이 발생한 경우 발생합니다. 현재 실행중인 메소드가 의존하는 클래스의 정의는 이후 변경되었습니다. "

찾는 최종 사용자는 바이트 코드에서"최적화 "로 복사되기 때문에 정적 최종 리터럴 값이 변경됩니다. 편집 : 이것은 라이브러리 업그레이드의 결과처럼 간단 할 수 있습니다. 내가 알고있는 유일한 수정은 깨끗한 재 구축입니다.

관련 문제