2013-04-17 1 views
2

노드 중 하나에 초기화 문제가있는 WebSphere 7/IBM JDK 6에서 이상한 문제가 발생했습니다.StringBuilder : ArrayIndexOutOfBoundsException

Caused by: java.lang.ArrayIndexOutOfBoundsException 
     at java.lang.String.getChars(String.java:666) 
     at java.lang.StringBuilder.append(StringBuilder.java:207) 
     at javax.naming.spi.NamingManager.getURLContext(NamingManager.java:646) 
     at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:422) 
     at javax.naming.InitialContext.lookup(InitialContext.java:436) 
     [...] 

우리는되어 javax.naming.spi.NamingManager의 소스 코드를 살펴했다 :

우리는 InitialContext.lookup로를 호출하고이 노드에서 우리는 가끔 다음과 같은 예외를 받고있어 일부 코드가 있습니다. getURLContext :

public static Context getURLContext(String schema, Hashtable<?, ?> envmt) 
     throws NamingException { 

    if (null == schema || 0 == schema.length() || null == envmt) { 
     return null; 
    } 

    // obtain pkg prefixes from hashtable 
    String pkgPrefixes[] = EnvironmentReader 
      .getFactoryNamesFromEnvironmentAndProviderResource(envmt, null, 
        Context.URL_PKG_PREFIXES); 

    for (String element : pkgPrefixes) { 
     // create factory instance 
     ObjectFactory factory; 
     String clsName = element + "." //$NON-NLS-1$ 
       + schema + "." //$NON-NLS-1$ 
       + schema + "URLContextFactory"; //$NON-NLS-1$ 
    [...] 

라인 (646)은 대한 루프 강화되지만 다음 문은 문자열 연결하고 아마 컴파일러에 의해 모두 StringBuilder로 대체됩니다.

우리는 StringBuilder에 대한 몇 가지 빠른 단위 테스트를 수행했지만 ArrayIndexOutOfBoundsException을 유발할 수 없습니다.

어떻게 ArrayIndexOutOfBoundsException을 던져 버릴 수 있으며 어떻게 피할 수 있습니까?

편집 : 우리는 다음과 같은 자바 버전을 사용하는

는 :

java version "1.6.0" 
Java(TM) SE Runtime Environment (build pxa6460sr9fp2ifix-20110913_02(SR9 FP2+IV03622+IZ99243)) 
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 Linux amd64-64 jvmxa6460sr9-20110912_90359 (JIT enabled, AOT enabled) 
J9VM - 20110912_090359 
JIT - r9_20101028_17488ifx31 
GC - 20101027_AA) 
JCL - 20110727_04 
+0

실제로 어떤 일이 발생했는지 확인하기 위해 중단 점을 설정해 보셨습니까? – Kai

+0

너무 늦어 문제가 발생한 노드가 이미 다시 시작되었습니다. : -/ – Puce

+0

테스트 시스템을 가지고 있지 않습니까? ; - | 언급 한 for-loop의 코드를 추가로 게시 할 수 있습니까? – Kai

답변

2

이는 IBM JVM의 JIT 컴파일러의 알려진 버그입니다.

-Xjit:exclude={ProgramClass.callStringGetChars*} 

는 참조 용으로 IZ78413: JIT-COMPILED STRING.GETCHARS THROWS UNEXPECTED ARRAYINDEXOUTOFBO UNDSEXCEPTION 참조 : 해결 방법은 JIT 컴파일에서 getChars의 배제 될 것으로 보인다.

+0

고마워, 나는 우리가 가지고있는 버전을 다시 확인하겠습니다. – Puce

+0

문제는 "이 결함은 다음에서 수정 될 것입니다 : 6.0.0 SR9 의 JIT 컴파일러가 수정되었습니다. 수정 프로그램을 얻으려면 빌드 20100622 이상을 설치하십시오. " 그래서 우리는이 수정 사항을 가져야합니다. (우리가 사용하는 자바 버전을 언급하는 편집 된 질문을 참조하십시오) – Puce

+0

우리가 사용하는 버전이 왜 그런지 모르겠습니다. 수정이 포함되어 있지만이 대답은 올바른 방향으로 간다, 받아 들일 것 같아 – Puce

0

null 환경 해시 테이블을 전달하면 위의 코드는 null을 반환하는 것으로 보입니다.

이렇게하면 일종의 인수로 InitialContext를 인스턴스화하는지 궁금합니다.

위의 코드가 실제로 소스 인 경우 null 환경 해시 테이블을 전달하면 getURLContext()를 연결하여 문자열 연결 루프 이전에 null을 반환합니다.

JNDI 환경 변수 (예 : 기본 JNDI env 사용)를 지정할 필요가없는 경우 new InitialContext() 또는 new InitialContext(null)을 시도 할 수 있습니까?

+0

envmt가 null 인 경우 스택 추적과 일치하지 않습니다. 생각한다. – Puce