Этот код зависает, если его запустить на серверной JVM:
Ниже пример результатов (на одной и той же машине, Linux Gentoo 64-bit, java 1.6.0_24):
2: 373
<зависает>
2: 365
<зависает>
2: 520
3: 518
4: 526
doNotOptimizeOut value: -100663296
Под линуксом (java 1.6.0_24), при подвисании процесс поедает оба (все доступные?) ядра процессора, и его можно убить только девяткой (kill -9).
Все то же самое верно про 64-битный Windows (java 1.6.0_23), только там процесс занимает только одно ядро и легко снимается диспетчером задач.
Получен ID бага 7020614:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7020614.
UPD: баг открыли для всеобщего обозрения (по ссылке выше), можно зайти и проголосовать.
public class OptimizerBug {<br> private static final int ITERATIONS = 1000;<br> private static int doNotOptimizeOut = 0;<br><br> public static long bitCountShort() {<br> long t0 = System.currentTimeMillis();<br> int sum = 0;<br> for (int it = 0; it < ITERATIONS; ++it) {<br> short value = 0;<br> do {<br> sum += Integer.bitCount(value);<br> } while (++value != 0);<br> }<br> doNotOptimizeOut += sum;<br> return System.currentTimeMillis() - t0;<br> }<br><br> public static void main(String[] args) {<br> for (int i = 0; i < 4; ++i) {<br> System.out.println((i + 1) + ": " + bitCountShort());<br> }<br> System.out.println("doNotOptimizeOut value: " + doNotOptimizeOut);<br> }<br>}<br>
Ниже пример результатов (на одной и той же машине, Linux Gentoo 64-bit, java 1.6.0_24):
- [64-bit] java OptimizerBug:
2: 373
<зависает>
- [32-bit] java -server OptimizerBug:
2: 365
<зависает>
- [32-bit] java -client OptimizerBug
2: 520
3: 518
4: 526
doNotOptimizeOut value: -100663296
Под линуксом (java 1.6.0_24), при подвисании процесс поедает оба (все доступные?) ядра процессора, и его можно убить только девяткой (kill -9).
Все то же самое верно про 64-битный Windows (java 1.6.0_23), только там процесс занимает только одно ядро и легко снимается диспетчером задач.
Получен ID бага 7020614:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7020614.
UPD: баг открыли для всеобщего обозрения (по ссылке выше), можно зайти и проголосовать.
Хорошо, что их стали находить. Будем надеяться, их станут исправлять. Кстати, баг с зависанием в Double.parseDouble исправили в релизе 1.6.0_24.
А конкретно этот баг - ровно той же природы, что и с Integer.MAX_VALUE, только на этот раз на более естественном примере.