JAVA

Проработать

  1. Java. Web API | Марафон ІТ- технології 3.0
  2. Павел Кислов — OAuth 2, JWT, OIDC. Все, что нам недорассказали в Spring
  3. oauth vs oauth2
  4. jwt
  5. Amazon Web Services(AWS)
  6. Современная серверная разработка на языке Java: 1. Инструменты разработчика
  7. Современная серверная разработка на языке Java: 2. Архитектура серверного приложения
  8. How Senior Programmers ACTUALLY Write Code
  9. Тесты:

  10. Как наконец-то начать писать тесты и не пожалеть об этом
  11. Mocking Void Methods with Mockito
  12. Александр Баглай "Как работать с Mockito"
  13. Шесть простых примеров по Mockito (перевод)
  14. Java Servlets 10 Mockito тестирование
  15. Разное:

  16. Все о код-стайл в Java. Код-ревью и разбор проекта.
  17. Как Сделать Лучший Пет-Проект | Архитектура Бекенда за 1 час
  18. Как JIT-компиляция изменила мир
  19. Java Message Service (JMS)
  20. JAVA 21

  21. Java 21 новые возможности: Виртуальные потоки. Перевод.li>

    Собеседования

  22. Собеседование Java Middle | Реальное собеседование | Jetbulb
  23. Вопросы для собеседования на Java Developer
  24. Вопросы для собеседования на Java Developer
  25. Java Middle Interview
  26. Гриша Скобелев, Саша Бармин: Публичное собеседование Senior Software Engineer
  27. Собеседование по Java — ООП (вопросы и ответы). Часть 2
  28. Ответы на вопросы на собеседование Java core (часть 1).
  29. Вопросы для собеседования на Java Developer
  30. Максим Добрынин | ex. Jetbulb
  31. Реальное JAVA SENIOR собеседование ОФФЕР 435к
  32. На этих вопросах сыпятся джуны | Разбор JAVA собес

Что это:

JAVA - объектно ориентированный, компилирующийся(javac), интерпретирующийся(JVM, JIT), мультиплатформенный язык программирования.

Основные разделы:

  1. Android Studio
  2. Конвенция
  3. Java core
  4. Frameworks
  5. Immutable Class
  6. Jvm
  7. Библиотеки
  8. Память
  9. Системы сборок проектов
  10. Рефакторинг
  11. Web
  12. VisualVM
  13. Code review

Как работает JAVA

Создание, Компиляция:

  1. Пишем JAVA код(исходный код) в файлы .java.
  2. Через javac(.java -> .class) - компилируем в байт-код. Название байт-код было выбрано потому, что для кодирования каждой операции используется ровно один байт.

Запуск, Интерпретация(JVM):

  1. ClassLoader - Читает ".class". Загружает байткод в память(Metaspace) Создаёт объект Class<?>
  2. JIT(Just-in-time) - во время выполнения оптимизирует код и компилирует его в машинный код.
  3. Выполнение машинного кода.

Just-in-time

Just-in-time компилятор - кеширует код, который выполняется часто. Но это дополнительная память.

Есть 4 уровня JIT компиляции байт-кода в машинный код. Чем выше уровень компиляции, тем он сложнее, но и одновременно выполнение такого участка будет быстрее, чем участка с меньшим уровнем. JIT - компилятор самостоятельно решает, какой уровень компиляции задать для каждого фрагмента программы на основе того, как часто выполняется этот фрагмент.

Под капотом JVM использует 2 JIT-компилятора — C1 и C2. C1 компилятор так же называется клиентским компилятором и способен скомпилировать код только до 3-его уровня. За 4-й, самый сложны и быстрый уровень компиляции отвечает компилятор C2.

Из вышесказанного можно сделать вывод о том, что для простых, клиентских приложений, выгоднее использовать компилятор C1, так как в этом случае нам важно как быстро стартует приложение. Серверные, долгоживущие приложения могут стартовать большее количество времени, однако в дальнейшем должны работать и выполнять свою функцию быстро — тут нам подойдет компилятор C2.

При запуске Java — программы на x32 версии JVM мы в ручную можем указать, какой режим мы хотим использовать, при помощи флагов -client и -server. При указании флага -client JVM не будет производить сложные оптимизации с байт-кодом, что ускорит время старта приложения и уменьшит количество потребляемой памяти. При указании флага -server приложение будет стартовать большее количество времени из-за сложных оптимизаций байт-кода и будет использовать больше памяти для хранения машинного кода, однако в дальнейшем работать такая программа будет быстрее.

В x64 версии JVM флаг -client игнорируется и по умолчанию используется серверная конфигурация приложения.

Java roadmap

Тестовые задачи

Реализовать методы класса LinkedList

class Node {
    Integer value;
    Node next;
}

class LinkedList {
    private Node head;

    public void remove(Integer value) {
    }

    public void add(Integer prev, Integer next, Integer value) {
    }
}
        

GraalVM

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

Позволяет компилировать Java-приложение в нативный бинарник(exe), и запускается без JVM.

java app.jar → app.exe / app (без JVM)

Преимущества:

Например, в Spring Boot есть поддержка GraalVM Native Image.