2012-10-09 4 views
8

を使用している場合は、次のとおりです。にInteger.MAX_VALUEと比較してのSystem.out.println

1 
3 
5 
... 
31173 
31175 
End:31177 

なぜそれはそこで終わりますか?興味深いことに、forループでSystem.out.println(i)を削除した場合、出力はEnd:-2147483647になります。明らかにiの値はwrapped roundです。

私が使用しているJavaのバージョンは

Java(TM) SE Runtime Environment (build 1.6.0_16-b01) 
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode) 
+1

印刷しようInteger.MAX_VALUE –

+0

このような出力は得られません。あなたのバッファーがいっぱいになっているかのようです。 –

+2

コードはEndを出力するべきではありません。バグも同じですが(少し違いますが)、あなたが書いたループは無限です。私は常に<= Integer.MAX_VALUEになります。 – user439407

答えて

15

そのJITが誤ってループを最適化のJava 6での既知のバグです。最近のバージョンのJavaにはこのバグはありません。

http://vanillajava.blogspot.co.uk/2011/05/when-jit-gets-it-wrong.html

Java 6のアップデート16は、わずか2歳です。私はあなたができるBTWのJava 6が数ヶ月で無料サポートの終了(2012年12月)

+0

素晴らしいリソース。 +1 –

+0

乾杯:) ..... –

+0

非常に面白いです。私は、この異常な行動の根本的な原因を本当に知りませんでしたが、同様の発見を掲載しようとしていました。 –

1

になりますは、Java 7に

を更新できない場合は、最新バージョンのJava 6アップデート25にアップデートをお勧めInteger.MAX_VALUE-1を使用してJVMバグを回避してください。

関連する問題