2010-07-05 4 views
1

는 ("1.6.0_18" 오픈 JDK 런타임 환경 (IcedTea6 1.8) (페도라-36.b18.fc11-I386) 오픈 JDK 서버 VM 동일한 자바 버전 모두 동일한 6-7 서버의 설정을 상상해 빌드 14.0-b16, 혼합 모드)임의 JVM 동작

각각 몇 시간 동안 프로그램 (메모리 및 CPU 집약적)을 실행하여 성공적으로 여러 번 완료 (통계 자료를 얻는 것), 이지만 컴퓨터 1 대에 매개 변수 또는 내가 (javac -source 1.5 * .java/javac -O - 소스 1.5, javac **, 임의의 조합을 상상할 수있다.)
또는 -Xms200000k 또는 java bl 당신이 아이디어를 얻을 abla.java)

결국, 특정 순간이나 반복 "java.lang.ArrayIndexOutOfBoundsException : -1341472392"에 도착하지?! 첫 번째로 프로그램은 결코 큰 가치를 가지고 결코 작동하지 않을 것입니다. (코드 줄은 정수가 포함 된 ArrayList의 호출을 포함합니다) (그 번호는 매번 다른 것으로 나타납니다.)

또한 내가 충돌 한 테스트를 "다시 시작"할 수 있으며이 컴퓨터에서 " 테스트를 몇 번 더하고 다시 충돌합니다.

별로 신경 쓰지 않아도 상자를 소유하고 있으며 다른 모든 사람들은 작동하지 않지만 이것은 나에게 이상합니다.

개인 관심 부족 OpenJDK와 어쨌든 매우 어수선하게 어떻게 이런 일이 발생합니까?

+0

이 neg 값은 오버플로가 발생하는 유일한 아이디어입니다 ... 다른 컴퓨터에서 동일한 입력 데이터를 테스트 했습니까? – InsertNickHere

+0

좋은 지적입니다. 그렇습니다.하지만 다른 모든 기계에서 완벽하게 작동합니다. 물리적으로는 "기타"이지만 결함이있는 하드웨어 소프트웨어와 메모리 크기는 모두 동일합니다. – Recct

답변

3

소리가 이상합니다. 배열을 인덱싱하는 데 사용되는 변수가 길거나 긴 변수의 영향을 받습니까? 이중 또는 긴 변수가 휘발성이 선언되지 않은 경우, 부하의 목적을 위해, 상점, 읽기,

http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733에서, 그리고 :이 경우 변수에 대한 액세스는 원자 보장되지 않습니다 쓰기 작업은 각각 32 비트의 두 변수 인 것처럼 처리됩니다. 규칙에서 이러한 작업 중 하나가 필요한 경우 32 비트 반마다 하나씩 두 가지 작업이 수행됩니다. double 또는 long 변수의 64 비트가 두 개의 32 비트 수량으로 인코딩되는 방식은 구현에 따라 다릅니다. 휘발성 변수에 대한로드, 저장, 읽기 및 쓰기 작업은 변수 유형이 두 배 또는 길더라도 원자 단위입니다.

색인 변수를 휘발성으로 선언하거나 다른 동기화 수단 (예 : AtomicLong 또는 비슷한 것을 사용)을 사용하여 문제가 될 수 있다고 생각하면됩니다.

+0

흥미롭게도 인덱스 변수는 다른 루프에 의해 인덱싱되는 배열의 요소이지만 모두 정수이며 단일 스레드입니다. – Recct

+0

예를 들어 gui가 없습니까? – aioobe

0

이것이 단일 스레드 Java 응용 프로그램 인 경우 하드웨어 오류가 의심됩니다. 물론 하드웨어 (예 : 메모리) 진단을 실행하지 않는 한 증명하기가 어려울 수 있습니다.

+0

나는 (위의 주석에 대한 응답으로) 유일한 명령 행을 봅니다. – Recct