• Какие версии Java вы используете?

      С прошлого аналогичного опроса прошёл целый год, и пришла пора его повторить и немного расширить. Особенно при учёте того, что для Java 7 скоро перестанут выпускать обновления.

      Под катом этого поста, как и предыдущего, находятся разнообразные опросы и сборники предсказаний. По результатам голосований этого года мы сможем посмотреть, насколько близки к истине оказались в прошлый раз.

      Пожалуйста, если вы вообще не используете java, нажимайте «воздержаться», чтобы не портить статистику.

      Результаты прошлого опроса
      Прошлый опрос был произведён 14 февраля 2014 года. Java 8 была выпущена 18 марта 2014 года, то есть на 1 месяц и 4 дня позже, чем был проведён опрос.















      Сам опрос оказался под катом:
      Читать дальше →
    • Ахаха, HotSpot, что ты делаешь, прекрати!

      • Перевод
      • Tutorial


      Как вы наверняка уже знаете, скоро в Питере пройдёт очередная конференция Joker. Я собираюсь сделать на ней доклад о том, как расследовать поведение JVM, кажущееся поначалу таинственным и загадочным. Этот пост — тизер, предназначенный для того, чтобы дать вам возможность понять, чего ждать от доклада.

      Предположим, что к вам вдруг приходит информация о проблеме: при сборке мусора отображаются причины «Last Ditch Collection» и «No GC», и поиск в интернете не даёт ничего вразумительного. К счастью, HotSpot практически полностью собирается из OpenJDK, и потому, как минимум в теории, мы можем найти ответы на все интересующие нас вопросы прямо в исходниках. Чем мы и займёмся!

      Читать дальше →
      • +18
      • 9,8k
      • 9
    • Какие версии Java вы используете?

        Два года назад я делал опрос «Используете ли вы Java 7?». Похоже, пришла пора его повторить и немного расширить. Особенно при учёте того, что не за горами Java 8: 4 февраля вышел первый Release Candidate.

        Под катом разнообразные опросы и сборники предсказаний. Например, интересно бы было посмотреть через год, какой процент людей, считавших, что перейдут на Java 8, действительно это сделают.

        Пожалуйста, если вы вообще не используете java, нажимайте «воздержаться», чтобы не портить статистику.

        Результат прошлого опроса
        На момент опроса с релиза Java 7 прошло 6 месяцев и 17 дней. Актуальная версия была 7u3.



        Читать дальше →
      • А как же всё-таки работает многопоточность? Часть II: memory ordering

          картинка для привлечения внимания

          Знание об управлении потоками, которое мы получили в прошлом топике, конечно, велико, но вопросов остаётся всё равно много. Например: «Как работает happens-before?», «Правда ли, что volatile — это сброс кешей?», «Зачем вообще было городить какую-то модель памяти? Нормально же всё было, что началось-то такое?»

          Как и прошлая статья, эта построена по принципу «сначала кратко опишем, что должно происходить в теории, а потом отправимся в исходники и посмотрим, как это происходит там». Таким образом, первая часть во многом применима не только к Java, а потому и разработчики под другие платформы могут найти для себя что-то полезное.
          Go Deeper
        • А как же всё-таки работает многопоточность? Часть I: синхронизация

          • Tutorial
          картинка для привлечения внимания(пост из серии «я склонировал себе исходники hotspot, давайте посмотрим на них вместе»)
          Все, кто сталкивается с многопоточными проблемами (будь то производительность или непонятные гейзенбаги), неизбежно сталкиваются в процессе их решения с терминами вроде «inflation», «contention», «membar», «biased locking», «thread parking» и тому подобным. А вот все ли действительно знают, что за этими терминами скрывается? К сожалению, как показывает практика, не все.

          В надежде исправить ситуацию, я решил написать цикл статей на эту тему. Каждая из них будет построена по принципу «сначала кратко опишем, что должно происходить в теории, а потом отправимся в исходники и посмотрим, как это происходит там». Таким образом, первая часть во многом применима не только к Java, а потому и разработчики под другие платформы могут найти для себя что-то полезное.

          Перед прочтением глубокого описания полезно убедиться в том, что вы в достаточной мере разбираетесь в Java Memory Model. Изучить её можно, например, по слайдам Сергея Walrus Куксенко или по моему раннему топику. Также отличным материалом является вот эта презентация, начиная со слайда #38.
          Читать дальше. Много.
        • Как собрать свою JDK, без блекджека и автоматической сборки мусора

          • Tutorial
          На недавно прошедшей Java One Руслан cheremin рассказывал о том, что разработчики Disruptor используют JVM без сборщика мусора. У них на то были свои причины, которые не имеют к этому топику никакого отношения.

          Я же давно хотел поковыряться в исходниках виртуальной машины, и выпиливание из неё GC – отличное начало. Под катом я расскажу вам, как собрать OpenJDK, выпилить из неё сборщик мусора и снова собрать. Ближе к концу даже будет дан ответ на наверняка пришедший вам в голову вопрос «зачем».

          Читать дальше →
        • Mutation testing на примере Pitest

          • Tutorial
          Многие из вас, возможно, слышали про Mutation Testing в замечательном подкасте «Разбор полётов» или читали в википедии. Для тех, кто всё-таки с понятием пока не знаком, в двух словах объясню.

          Мутационное тестирование — альтернативный подход к измерению качества ваших тестов. Вместо того, чтобы считать банальный code coverage, используется более разумный механизм. В байт-код ваших классов внедряются случайные изменения, иначе называемые мутациями. Если после такой мутации не упал ни один тест, который покрывает внесённые изменения, то велика вероятность того, что с тестами у вас не особо-то и хорошо. Пример возможной мутации:
          Было:
          if(somevalue < threshold) {
              doSomething();
          }
          
          Стало:
          if(somevalue >= threshold) {
              doSomething();
          }
          
          Изменение довольно критичное, потому тест, покрывающий этот блок кода, наверняка должен упасть. Под катом я расскажу о весьма хорошей библиотеке Pitest, покажу, как её подключить к своему проекту, и приведу результаты тестирования на реальном коде.
          Читать дальше →
        • JMock и EasyMock: сравнение и howto в примерах и не только

          • Tutorial
          Практически ни для кого не секрет, что при тестировании кода, использующего какие-то внешние компоненты, часто применяют подход mock-объектов. Для тех, кто всё же о нём не знает, кратко поясню: это такие объекты, которые имеют тот же интерфейс, что и используемые компоненты, но их поведение полностью задаётся в тесте, и их использование позволяет избежать поднятия полной инфраструктуры, необходимой приложению для запуска. Что ещё более важно, можно легко и непринуждённо проконтролировать, что код вызывал те или иные методы у mock-объекта с теми или иными аргументами.

          В этой статье я проведу сравнительный анализ двух распространённых в Java библиотек для работы с mock'ами: EasyMock и JMock. Для осознания достаточно базового знания JUnit, а после прочтения этой статьи у вас будет весьма хорошее представление о том, как пользоваться обеими этими библиотеками.
          Читать дальше →
        • Модель памяти в примерах и не только

          • Tutorial
          В продолжение серии топиков под названием «фундаментальные вещи о Java, которые стоит знать, но которые многие не знают». Предыдущий топик: Бинарная совместимость в примерах и не только

          Модель памяти Java — нечто, что оказывает влияние на то, как работает код любого java-разработчика. Тем не менее, довольно многие пренебрегают знанием этой важной темы, и порой наталкиваются на совершенно неожиданное поведение их приложений, которое объясняется именно особенностями устройства JMM. Возьмём для примера весьма распространённую и некорректную реализацию паттерна Double-checked locking:

          public class Keeper {
              private Data data = null;
              
              public Data getData() {
                  if(data == null) {
                      synchronized(this) {
                          if(data == null) {
                              data = new Data();
                          }
                      }
                  }
                  
                  return data;
              }
          }
          

          Люди, пишущие подобный код, пытаются добиться улучшения производительности, избегая блокировки, если значение уже было присвоено. К сожалению, эти люди не учитывают многих факторов, в результате проявления которых может случиться зомби-апокалипсис. Под катом я расскажу теорию и приведу примеры того, как что-то может пойти не так. Кроме того, как говорили в одном индийском фильме, «Мало знать, что не так. Нужно знать, как сделать так, чтобы было так». Потому и рецепты успеха вы также сможете найти дальше.
          Читать дальше →