JLS에 따르면 int
초기화 직후 배열을 0으로 채워야합니다. 그러나 나는 그렇지 않은 상황에 직면 해 있습니다. 이러한 동작은 JDK 7u4에서 처음 발생하며 이후의 모든 업데이트에서도 발생합니다 (64 비트 구현 사용). 다음 코드는 예외를 발생시킵니다.
public static void main(String[] args) {
int[] a;
int n = 0;
for (int i = 0; i < 100000000; ++i) {
a = new int[10];
for (int f : a)
if (f != 0)
throw new RuntimeException("Array just after allocation: "+ Arrays.toString(a));
Arrays.fill(a, 0);
for (int j = 0; j < a.length; ++j)
a[j] = (n - j)*i;
for (int f : a)
n += f;
}
System.out.println(n);
}
JVM이 코드 블록의 컴파일을 수행 한 후 -Xint
플래그 와 함께 발생하지 않으면 예외가 발생합니다 . 또한, Arrays.fill(...)
이 코드의 다른 모든 명령문과 같은 명령문이 필요하며 예외가 없으면 예외가 발생하지 않습니다. 이 가능한 버그는 일부 JVM 최적화와 관련이 있습니다. 그러한 행동의 이유에 대한 아이디어가 있습니까?
업데이트 :
Gentoo Linux, Debian Linux (커널 3.0 버전) 및 MacOS Lion의 HotSpot 64 비트 서버 VM, Java 버전 1.7.0_04 ~ 1.7.0_10 에서이 동작이 나타납니다. 이 오류는 항상 위의 코드로 재현 할 수 있습니다. 32 비트 JDK 또는 Windows에서이 문제를 테스트하지 않았습니다. 이미 버그 보고서를 Oracle (버그 ID 7196857)에 보냈으며 며칠 후에 공개 Oracle 버그 데이터베이스에 나타납니다.
업데이트 :
Oracle은 공개 버그 데이터베이스에이 버그를 게시했습니다. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857