ProgramingTip

이것은 JVM 버그입니까 아니면 "예상 된 동작"입니까?

bestdevel 2020. 11. 2. 08:11
반응형

이것은 JVM 버그입니까 아니면 "예상 된 동작"입니까?


예상치 못한 동작 (개인적 기대에 비해 예상치 못한 발견)을 발견하고, JVM에 버그가 있는지 또는 이것이 정확히 무엇에 대한 세부 사항을 발견했는지 궁금합니다. 일어나기로되어 있습니다. 메인 메소드에 자체적으로 다음 코드가 검증 가정합니다.

int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
  count++;
}
System.out.println(i++);

순진한 기대는 표현할 Integer.MAX_VALUE-1수있는 가장 큰 인쇄가 될 것 int입니다. 나는 정수 연산이 1을 추가, 자바에서 "롤오버"로 인해 존재하는 생각 Integer.MAX_VALUE초래한다 Integer.MIN_VALUE. Integer.MIN_VALUE는 여전히보다 작기 때문에 Integer.MAX_VALUE루프는 음의 짝수 정수를 계속 반복합니다. 결국 0으로 돌아가고이 프로세스는 무한 루프로 반복되어야합니다.

이 코드를 실제로 실행하면 비 결정적 결과가 나타납니다. 50 만 정도 인쇄되는 결과는 가격이 인쇄됩니다. 따라서 루프가 무한 루프가 될 것입니다. 무슨 일이야?

제 생각에는 이것이 JVM의 버그이거나 예상되는 동작을 만드는 많은 펑키 최적화가 진행되고있는 것입니다. 이니?


불량 버그. 와 연관되다

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6196102

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6357214

다른 사람.

현실 세계에 나오지 않기 때문에 우선 순위가 낮아집니다.


이것은 기괴합니다. 확실히 어딘가에 버그처럼. 동일한 코드로 매번 동일한 결과를 얻지 만 코드를 사소하게 변경하면 결과가 변경됩니다. 예를 들면 :

public class Test {
  public static void main(String[] args) {
    int i;
    int count = 0;
    for (i = 0; i < Integer.MAX_VALUE; i+=2) {
      count++;
    }
    System.out.println(i);
    System.out.println(i < Integer.MAX_VALUE);
  }
}

... 항상 2147483640을 인쇄하고 true

반면에 :

public class Test {
  public static void main(String[] args) {
    int i;
    for (i = 0; i < Integer.MAX_VALUE; i+=2) {
    }
    System.out.println(i);
    System.out.println(i < Integer.MAX_VALUE);
  }
}

항상 -2147483648을 인쇄하고 사실입니다.

아주, 아주 이상합니다.

(Linux에서 OpenJDK 1.6 VM을 실행 중입니다.)

편집 : Windows 7에서 OpenJDK 1.7 실행 중 문제가 표시되지 않습니다.

java version "1.7.0-ea"
Java(TM) SE Runtime Environment (build 1.7.0-ea-b78)
Java HotSpot(TM) Client VM (build 17.0-b05, mixed mode, sharing)

추가 시도 System.out.println(count);

결과를 읽지 않기 때문에 최적화가 발생하는지 궁금합니다.

편집 -다른 답변은 Oracle 버그 추적기의 버그에 대한 링크를 제공했습니다. 그로부터 그리기 :

  • 6196102 는 특히 Integer.MAX_VALUE관련된 표준화 버그가 있음을 언급합니다 .
  • Java는 count읽지 않기 때문에 루프를 최적화해야합니다 .

그러나 다음과 같은 이유로 실제로 발생하지는 않습니다.

  • Integer.MAX_VALUE 가능성이없는 루프 가드
  • 일반적으로 루프는 처음에이 최적화를 허용하지 않는 작업을 수행합니다.

이것은 동일한 결과를 관찰 할 때 루프 최적화 인 것처럼 보이지만 인쇄 count하면 결과가 변경됩니다.

    int i;
    int count = 0;
    for(i=0; i < Integer.MAX_VALUE; i+=2){
      count++;
    }
    System.out.println(count);
    System.out.println(i++);

원본 코드는 457158 (또는 유사)을 생성하는 동안 2147483638을 생성합니다.


java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)

예상대로 작동합니다. 무한 루프

참고 URL : https://stackoverflow.com/questions/5183468/is-this-a-jvm-bug-or-expected-behavior

반응형