Что скрывает @SpringBootApplication

Автоматическая конфигурация в Spring Boot существенно облегчает жизнь разработчика, исключая так называемый “настроечный boilerplate” из повседневной рутины. Для запуска и конфигурирования приложения на Spring Boot хватит двух аннотаций: Аннотация @SpringBootApplication включает сканирование компонентов и автоматическую конфигурацию приложения. На самом деле, за этой аннотацией скрывается целых три: @Configuration (Spring) – помечает...

Continue reading...

Intellij IDEA + JUnit 4 + Gradle: Test events were not received

Столкнулся с проблемой, когда при попытке запустить цель test в gradle-проекте тесты не выполняются с сообщением Test events were not received. Такое может происходить потому, что тестируемые классы проекта не изменились с момента предыдущего запуска unit-тестов. Для очистки результатов всех тестов нужно запустить цель cleanTest. Подробнее можно почитать здесь.

Continue reading...

java.lang.NoClassDefFoundError: Could not initialize class

Недавно я столкнулся с проблемой при отладке интеграции с одним из сторонних приложений, которое поставляется ‘as is’ и работает на IBM WebSphere. Оно использует внутренние JMS-очереди сервера для коммуникации с нашими приложениями, развернутыми там же. При миграции на новую версию сервера я столкнулся с NoClassDefFoundError, возникающей в одном из классов...

Continue reading...

Многопоточность в Java

Это – перевод статьи “Threading in Java” автора Beka Kodirov. Вторая часть статьи находится здесь. Чем отличается поток от процесса? Процессы были разработаны для обеспечения многозадачности в операционных системах. Все приложения живут в рамках процессов, а память и ЦПУ выделяются напрямую ядром ОС. При желании можно запустить часть вашего приложения...

Continue reading...

Как работает обработка исключений на уровне виртуальной машины Java

Источник: Java Perfomance (Hunt & John, 2011)  Виртуальные машины Java используют исключения в качестве сигнала о том, что программа нарушила некие семантические ограничения языка. Например, попытка получить доступ к индексу за пределами массива вызовет ошибку. Исключение провоцирует нелокальное перемещение контроля из точки возникновения или “выброса”, в точку, которая была определена...

Continue reading...

Типы опций командной строки для запуска виртуальной машины Java

Источник: Java Perfomance (Hunt & John, 2011) Существует три типа опций командной строки: стандартные, нестандартные и опции разработчиков. Стандартные опции могут использоваться в любой реализации JVM, как того требует the Java Virtual Machine Specification. Они остаются неизменными от релиза к релизу, однако могут стать deprecated в релизах, следующих за тем,...

Continue reading...

Integer Cache в Java

Для оптимизации потребления памяти некоторые классы-оболочки в Java (например Integer, Byte, Short, Long и Character ) кэшируют значения в ограниченном диапазоне (чаще всего от -128 до 127). Покопавшись в исходниках JDK, можно отыскать внутренний статический класс IntegerCache: В Static-блоке инициализируется массив cache, он заполняется объектами Integer со значениями от -128...

Continue reading...

Многопоточность в Java: Hardware

Это – перевод статьи “Threading in Java. Part II. Hardware” автора Beka Kodirov. Первая часть статьи находится здесь. Расскажите об иерархии кэшей L1/L2/L3? Зачем они нужны? Кэши L1/L2/L3 это сегменты памяти, в чем-то схожие с RAM. Это быстрая память небольшого объёма, которая используется для уменьшения времени доступа процессора к данным...

Continue reading...

Не-атомарность i++, volatile и synchronized

Постфиксный инкремент в Java не является атомарным. Это означает, что в реальности за вызовом i++ скрывается несколько последовательных операций. Переменная сперва считывается из памяти, затем увеличивается на единицу, а результат снова записывается в память. При использовании операции в многопоточном окружении эта особенность может привести к нежелательным последствиям. Если несколько потоков...

Continue reading...

hashCode() и equals(): нарушить (,) нельзя (,) соблюдать

Второй по популярности (после различий между LinkedList и ArrayList) вопрос на собеседованиях – контракт между методами hashCode() и equals(). Метод hashCode() класса Object – нативный (то есть написан не на Java и вызывается с помощью JNI). Из сигнатуры следует, что хэш-код является некоторым целочисленным значением типа int. Полагаю, что реализация...

Continue reading...