Показаны сообщения с ярлыком java. Показать все сообщения
Показаны сообщения с ярлыком java. Показать все сообщения

пятница, 22 декабря 2017 г.

CPU оптимизации

Сегодня, в этой небольшой статье, я хотел бы поделиться своими знаниями об оптимизациях центрального процессора. А именно:

  1. branch prediction
  2. cache levels
  3. false sharing
  4. prefetching

Начнем в первой. В детали вдаваться не буду, а начну сразу с примера. Допустим у нас есть следующий метод:

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

суббота, 21 октября 2017 г.

О строителях

Сегодня речь пойдет о шаблоне проектирования Builder, или же по русски, строитель.
Начнем с определения и выясним для чего он нужен.

Строитель относится к порождающим шаблонам, а значит, с его помощью создаются объекты. Он позволяет конструировать объект по частям. Приведу пример, как выглядит типичный Builder.
Допустим у нас есть класс Person

суббота, 15 июля 2017 г.

Генерирование классов во время выполнения

dynamic

Иногда требуется создать класс с определенным поведением во время работы программы. К сожалению, Java не обладает динамизмом, присущем таким языками как Python, Javascript, Groovy. Но все же, возможность такая существует, и есть несколько способов это сделать. Например, сгенерировать напрямую байткод. Но такой способ, довольно сложен. Мы же, в данной статье, напишем исходный код и затем скомпилируем его.

вторник, 21 марта 2017 г.

Задача о корректности расстановки скобок

Хочется рассказать о такой задаче, как определение корректности расстановки скобок. Она так же известна, как balanced parenthesis problem. Суть ее в следующем: дана строка, содержащая открывающиеся и закрывающиеся скобки, и какие то другие символы. Нужно узнать правильно ли расставлены скобки. Т.е. для каждой открывающейся скобки должна быть закрывающаяся. Например, строки вида (()) или (()()) содержат корректную расстановку, а (()() и )()( уже нет.

воскресенье, 20 марта 2016 г.

JVM параметры для тонкой настройки сборщика мусора

Совсем недавно столкнулся с необходимостью уменьшения паузы "stop world" во время сборки мусора. Во время копания в данном вопросе, открыл для себя множество интересных параметров jvm. Чтобы знания не потерялись, решил зафиксировать их в табличку.

пятница, 26 февраля 2016 г.

Rest сервис на Netty

netty framework logo
Недавно познакомился с фреймворком Netty. В традиционной модели на каждое соединение создается один поток, который его обрабатывает. Это приводит к росту нагрузки на CPU и объема потребляемой памяти. Netty использует другой подход, позволяющий обрабатывать одновременно количество соединений большее, чем количество запущенных потоков. Реализован он с использованием библиотеки java.nio. В данной статье, я опишу как Netty работает и расскажу как реализовать с его помощью простой REST сервис.

среда, 10 февраля 2016 г.

Хроника будней java EE разработчика

Однажды при деплои на тестовый стенд обнаружилась такая ошибка NoSuchMethodException. Просмотр логов дал следующую информацию:


Довольно странное исключение, если учесть, что локально, все работало прекрасно. Наиболее вероятной причиной возникновения данной ошибки - разные версии библиотек. Судя по всему, в проекте оказалось несколько версий одного и того же класса. Как это решается?

понедельник, 25 января 2016 г.

Collect своими руками

После выхода java 8 появилась возможность писать в pipeline стиле. Т.е. создавать последовательность операций которые будут обрабатывать элементы из некоторого источника, будь то коллекция, бесконечная и конечная генерирующая функция, строки из файла и пр. Это тема достаточно обширная и она не будет освещена в данном топике. Расскажу про collector'ы. Это такие объекты с помощью которых, можно привести результат обработки элементов к определенному виду. Существует несколько встроенных, в классе java.util.stream.Collectors. Например, там есть toList, он создает список из элементов потока. Есть и более сложные, например, groupingBy, группирующий элементы по определенному критерию. Мы же напишем свой, который будет группировать строки по начальным буквам.

среда, 9 декабря 2015 г.

Кэширование в hibernate

На днях столкнулся с задачей кэширования запросов к БД. Приложение использовало, как это не странно, hibernate. В этой статье я расскажу, о том какие бывают кэши в hibernate, каким образом их использовать и как настраивать.

вторник, 8 декабря 2015 г.

Кое-что о ссылках в java

Сегодня поговорим о том, какие бывают ссылки в языке java.
Их всего четыре вида: Strong, Weak, Phantom и Soft.
Чтобы воспользоваться ими, за исключением первой, нужно использовать соответствующие классы из пакета java.lang.refs
Чем же они различаются и какими суперспособностями обладает каждая из них? Различия в основном связаны с поведением сборщика мусора, в тот момент когда он их обрабатывает.

суббота, 21 ноября 2015 г.

Порядок создание объектов в Java

Никогда не задумывались, как происходит инициализация объекта класса, который в свою очередь наследуется от другого класса?
Порядок довольно прост. Допустим у нас есть класс Parent и класс Child. Child является потомком Parent.
В обоих классах есть и статические и простые блоки инициализации, так присутствуют и поля.
При попытке создать объект класса Child, происходит следующее:

  1. В порядке объявления, будут проинициализированы статические блоки и статические переменные в родительском классе.
  2. То же самое произойдет в классе потомке
  3. Инициализация в порядке объявления не статических переменных и не статических блоков инициализации в классе Parent
  4. Вызов конструктора Parent
  5. Инициализация нестатических полей и блоков инициализации в классе Child в порядке объявления
  6. Вызов конструктора Child

воскресенье, 4 октября 2015 г.

Коротко о PESC

Данный прием используется для обеспечения гибкости при проектировании api с использовании generic'ов. Для дальнейшего понимания, стоит напомнить, что такое wildcard в java.
Wildcard - это ограничение для типов, которые мы определяем с помощью generic'ов. Оно может быть как сверху, так и снизу.
Ограничение снизу, определяется следующим образом Ему удовлетворяют все классы, у которых потомком является класс T.
Обозначает ограничение сверху, под него подпадают все классы наследованые от класса T.
Итак, вернемся теперь к PECS. Он гласит: producer - extends, consumer - super.
Если метод является producer, то используем ограничение сверху, если consumer, то снизу. Осталось определить, когда метод является consumer, а когда producer.
Лучше показать на примерах.

пятница, 10 июля 2015 г.

Идеальный singleton

Не буду рассказывать, что такое singleton и для чего он нужен. Расскажу про то, как его писать. Всегда склонялся к варианту double check, но после статьи про текущую модель памяти в java, мир для меня перестал быть прежним. Оказывается, volatile довольно затратная операция и немного лучше synchronized. Наилучшим же вариантом с ленивой инициализацией будет следующий код:
   public class Singleton{
      private Singleton(){};
      
      public Singleton getInstance(){
          return SingletonCreator.instance;
      }
      private static class SingletonCreator{
          public static final Singleton instance = new Singleton();
      }      
   }

воскресенье, 28 июня 2015 г.

Контракты для equals

Как известно, метод equals() определен в классе Object. Его реализация в данном классе, это простое сравнение ссылок, и если ссылки разные, то метод возвращает false. Если Вы хотите переопределить данный метод, не стоит забывать о контракте с методом hashCode(). Он гласит - если equals() возвращает true, то значение hashCode() для этих объектов будет одинаковое, но выполнение обратного необязательно.
Есть еще один контракт, о котором стоит помнить при написании своего собственного метода equals(). Все ниже перечисленные переменные не null.
  • Он должен быть рефлексивный, т.е. для любых значений x, x.equals(x) должен возвращать всегда true
  • Метод должен быть симметричен: для любых значений x и y, если x.equals(y) == true должно выполняться y.equals(x) == true
  • Должно выполняться условие транзитивности: если x.equals(y) == true и y.equals(z) == true, то x.equals(z) == true
  • Консистентность - это значит, что метод будет возвращать одно и тоже значение, независимо от того, сколько раз его вызвали, до тех пор, пока состояние объектов, для которых он вызывается, не изменено.
  • И последнее, для всех null значений метод должен возвращать false - x.equals(null) = false

Ссылка на оригинал
Пейте кофе, пишите на java ;)