Блог пользователя MaxBuzz

Автор MaxBuzz, 14 лет назад, перевод, По-русски
Этот код зависает, если его запустить на серверной JVM:

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:
1: 380
2: 373
<зависает>
  • [32-bit] java -server OptimizerBug:
1: 386
2: 365
<зависает>
  • [32-bit] java -client OptimizerBug
1: 525
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: баг открыли для всеобщего обозрения (по ссылке выше), можно зайти и проголосовать.
  • Проголосовать: нравится
  • +15
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
На OpenJDK (64 бита, fedora-33.b16.fc12-x86_64) воспроизводиться.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
У меня то же самое происходит, Ubuntu Linux 10.04 (32 bit), java version "1.6.0_20"
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Я заметил здесь, на Codeforces, все чаще стали писать про баги в Java, как-то грустно :(
  • 14 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    Лучше чтобы баги находились. Мне вот весело :)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Все эти баги сродни, например, тому, что gcc -O3 убивает многие программы - примерно по той же причине, слишком агрессивная оптимизация.

    Хорошо, что их стали находить. Будем надеяться, их станут исправлять. Кстати, баг с зависанием в Double.parseDouble исправили в релизе 1.6.0_24.

    А конкретно этот баг - ровно той же природы, что и с Integer.MAX_VALUE, только на этот раз на более естественном примере.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
congrats!!