Пользователь
0,0
рейтинг
1 августа 2011 в 12:33

Разработка → Не используйте Java7 ни для чего перевод

JAVA*
Java 7 вышла не так давно, но за 5 дней до её релиза было обнаружено несколько ужасных ошибок в горячей оптимизации циклов, которая включена по умолчанию и приводит Java Virtual Machine к краху (в лучшем случае).

Эти ошибки ([1],[2],[3]) заметили пользователи и разработчики Apache Lucene/Solr ([4],[5]). Их обещали устранить в Java 7 Update 2 ([6]).
Замечание: эти ошибки также могут проявляться в Java 6, если включён один из флагов оптимизации: -XX:+OptimizeStringConcat или -XX:+AggressiveOpts у JVM.

Итог: не используйте Java 7 ни для чего, за исключением тех случаев, когда ваша программа не содержит циклов.



Upd thx: OLS, WebSpider.
Перевод: hossman
Ринат Биков @BeCase
карма
3,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (53)

  • –44
    Как я рад, что несколько лет назад выбрал правильный язык.
    • +55
      Это вы про PHP?
      • +12
        Про английский?
        • +13
          Вы сделали пластическую операцию?
      • –23
        Да, про PHP. С юмором как-то тяжело.
        • +2
          А что недавно можно было завалить, просто отослав в качестве параметра хитрое число?
          • +4
            вобще-то яву эта бага тоже коснулась и почти в то же время, только число было другое :)
  • +5
    Очень жаль, что так поспешили, в такой платформе делать такие ошибки.
    • +3
      > Очень жаль, что так поспешили, в такой платформе делать такие ошибки.

      Крупный продакшн еще достаточно долго на семерку переходить не будет. Так что ничего особо страшного не случилось имхо. И хорошо что нашли весь этот ужас через 5 дней после релиза первой версии, а не через 5 месяцев.
      • +1
        > через 5 дней после

        Следует читать как «за 5 дней до» :) Сорри, много бессоных ночей за спиной.
  • +13
    Я думаю все этого ждали, и вряд ли все компании сразу бросились переходить на java 7.
  • +6
    Итог: не используйте Java 7 ни для чего, только если ваша программа не содержит циклов.

    Немного неудачный перевод. В русском языке эта фраза имеет смысл противоположный заложенному автором.
    • +2
      Согласен. Правильнее было бы перевести так: «Итог: не используйте Java 7 ни для чего, за исключением случаев, когда ваша программа не содержит циклов»
      • –2
        Поправил, согласен, что не совсем удачный перевод выбрал, более точный перевод получался каким-то громоздким.
    • +5
      зачем мудрить?
      «не используйте Java 7 ни для чего, если ваша программа содержит циклы»
      • 0
        Или просто «не используйте Java 7, если ваша программа содержит циклы»
        • 0
          надо бережно относиться к мысли автора.
  • 0
    Сколько, интересно, на свете программ, не содержащих циклов?
    • +2
      Hello World…
      • 0
        вы были быстрей)
    • 0
      Hello world?
    • –3
      Интересно, что это кому-то интересно.
    • +4
      Бросай циклы, используй рекурсии? :).
      Кто-то вообще без условных переходов пытается программировать.
  • –3
    (facepalm) Ну, здравствуй, Oracle :(
    • +2
      Да бросте. Вспомните это.
  • +10
    workaround:
    -XX:-UseLoopPredicate
    Пока не выйдет update 7u2
  • +1
    «но за 5 дней до её релиза было обнаружено несколько ужасных ошибок»
    Вот к чему приводят запланированные релизы. Что, никак нельзя было перенести дату релиза на пару-тройку недель и поправить все известные баги?!
    • +2
      Они и так уже переносили этот релиз, решили, что откладывать больше не стоит.
      Кроме того, автор оригинала сгущает краски, потому как не на всех циклах это проявляется.
      • 0
        Ну и что такого в том что уже переносили дату релиза? Вот Вам, например, что лучше будет, преждевременный релиз, кишаший известными ранее багами, или задержка релиза, но уже исправленная?
        • 0
          Ну в любом случае баги будут всегда… Хотя да… могли бы недельку подождать всё-равно люди будут ждать… только теперь апдейта… :)
  • +13
    Наконец-то мои коллеги поймут что они были неправы, когда говорили что мне надо отказаться от goto ! irony mode off
  • +18
    Всё правильно, это в рамках подготовки к JDK8 и Project Lambda, чтобы отучить от императивных циклов и приучить к кошерному декларативному стилю и рекурсии.
    • +1
      ЗАЧЕМ превращать императивный язык программирования в функциональный? Потому что это модно в узком кругу маргиналов? Кому-то LISP'а не хватает?
      • 0
        Ох, сорри, забыл чекбокс «irony mode» поставить, когда писал комментарий. Извините ещё раз.
  • +2
    Вот уж не знаю, связано это или нет — но у меня minecraft на java7 работать отказался, в отличие от 6й версии и openjdk6
    • 0
      У меня Eclipse 3.6.2 (порт FreeBSD java/eclipse) на openjdk7 отказалась компилироваться из исходников — вылетела с ошибкой компиляции javac в одном из базовых дополнений. Хотя после сборки в openjdk6 запуск самой среды в openjdk7 происходит нормально без ошибок.
      Печально, что пересборку Eclipse с JDK7, который находился в разработке уже достаточно долго, не тестировали.
  • +4
    Итак, смотрим. (Выделение жирным шрифтом — моё)

    bugs.sun.com/bugdatabase/view_bug.do?bug_id=7070134

    FULL PRODUCT VERSION :
    java version "1.7.0"
    Java(TM) SE Runtime Environment (build 1.7.0-b147)
    Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)


    FULL OS VERSION :
    Linux beast 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:24 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux


    bugs.sun.com/bugdatabase/view_bug.do?bug_id=7044738

    % /java/re/jdk/7/latest/binaries/solaris-i586/bin/java -jar MicroBenchmarks/target/microbenchmarks.jar '.*JGAssign.*SameArrayInstance'
    CompilerOracle: print customer /micro/benchmarks/api/java/lang/StringMicros.compareTo
    Java HotSpot(TM) Server VM warning: printing of assembly code is enabled; turning on


    % /java/re/jdk/7/latest/binaries/solaris-i586/bin/java -server -XX:LoopUnrollLimit=1 -jar MicroBenchmarks2/target/microbenchmarks.jar '.*JGAssign.*SameArrayInstance'
    CompilerOracle: print customer /micro/benchmarks/api/java/lang/StringMicros.compareTo
    Java HotSpot(TM) Server VM warning: printing of assembly code is enabled; turning on


    bugs.sun.com/bugdatabase/view_bug.do?bug_id=7068051

    # JRE version: 7.0-b147
    # Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b17 mixed mode solaris-sparc compressed oops)


    issues.apache.org/jira/browse/LUCENE-3335
    по ссылке www.lucidimagination.com/search/document/3beaa082c4d2fdd4/porterstemfilter_kills_jvm

    # JRE version: 6.0_26-b03
    # Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode linux-amd64 compressed oops)


    issues.apache.org/jira/browse/LUCENE-3346

    [junit] NOTE: Linux 2.6.38-8-generic amd64/Oracle Corporation 1.7.0 (64-bit)/cpus=8,threads=1,free=194162192,total=252248064

    — Вывод: не используйте Java 7 Server VM на 64-битных машинах.
    И хватит панику создавать.
    Да и давно ли 64-битные системы стали полностью безглючными?
    • +1
      % /java/re/jdk/7/latest/binaries/solaris-i586/bin/java -jar

      Тут видно, что сборка не 64-разрядная.
      • 0
        А этот баг уже был закрыт месяц назад (http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/e3cbc9ddd434), надеюсь, фикс уже вошёл в релиз.

        Ну и Солярис очень всем важен?
    • 0
      Про панику согласен, это просто перевод оригинала. Я с мнением автора не полностью согласен.
    • 0
      Я последнюю 64 битную жава машину тупо убивал просто спамя объекты в 20 потоков. Падал по конкаренси ГЦ. Без всяких 7х яв и агресивных опций.
  • +6
    У ораклоненавистников появился лишний аргумент.
  • НЛО прилетело и опубликовало эту надпись здесь
  • +9
    Заголовок действительно читается как «Галактика в опасности! Мы все умрем!...» Эту багу можно легко вызвать на java6 включив механизм оптимизации. И об этом ВСЕ знали. Просто в java7 оптимизации сделали принудительными и вместо того, чтобы ждать фикса или просто принудительно отключить эти оптимизации, психически неустойчивые личности раздувают панику. К чему эти желтые заголовки на хабре?
    • +2
      Я не говорил, что согласен с автором и разделяю его пессимизм, он преувеличивает.
      Но и отрицать существование проблемы тут тоже нельзя.
      • 0
        А кто отрицает? Об этой проблеме было уже известно задолго до релиза и было известно лечение. Если раньше бага вылазила при использовании оптимизации, то теперь она вылезает по умолчанию. Но… есть всем известное поведение jvm, извесно как она ведет себя при оптимизации и без оптимизации. Разработчики Apache Lucene/Solr использовали поведение без оптимизации и имели профит по умолчанию, теперь что бы не менять код им нужно использовать ключи jvm, они негодуют и это понятно… Но есть другие разработчики, которые использовали поведение jvm с оптимизацией, и они обошли багу программным способом, либо вовсе использовали её для работы программы. И что произойдет после фикса? Поведение системы изменится и Apache Lucene/Solr конечно получат профит от этого, но есть другие программисты, которые использовали багу в работе и они будут вынуждены переписывать код.

        Известная бага — это не бага, а фича, особенность поведения системы. Да неприятная особенность. Но если её менять, то нужно быть на 1000% уверенным, что новое поведение системы не уничтожит работоспособность работающих программ. Поэтому ждать исправления баги придется очень долго. Им нужно будет тщательно протестировать новое поведение на влияние на уже работающих систем. Потому что если в результате исправления одной известной баги, они занесут в систему две неизвестные баги, то тогда я действительно буду сильно негодовать и буйствовать. А пока все нормально. В jvm главное стабильность, и тут действует принцип «не навреди». Паника начнется, когда будут вылезать неизвестные баги, а пока в Багдаде все спокойно.
    • +1
      Там вроде как эта бага может привести не только к крешу JVM, но так же может пострадать и данные, которые вы записываете (в данном случае битый индекс), что согласитесь не очень приятно. Теперь представьте, что вы распространяете java веб приложение в ввиде war архива и вам нужно настоятельно рекомендовать вашим пользователям отключать эти оптимизации циклов, иначе вы не несете гарантии за правильность работы вашего приложения. По моему серьезный геморрой для разработчиков, лучше бы задержали релиз и пофиксили.
  • +5
    Действительно, заголовок выглядит устрашающе. Только на самом деле ничего страшного не произошло.
    Да, есть баг.
    Да, есть workaround.
    Да, будет апдейт.
    Нет, вас это не убъет.
  • НЛО прилетело и опубликовало эту надпись здесь
  • –2
  • 0
    Немного не понятно — если баг критический, то почему ждать его исправления нужно до update`а 2, а не update`а 1???

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Интересные публикации