Core Java. Лекция 1

Обзор истории, возможностей и особенностей экосистемы Java

Иван Пономарёв, КУРС/МФТИ

me
  • Выпускник МФТИ 2003 г., к.ф.-м.н

  • Tech Lead at KURS

  • ERP systems & Java background

  • Speaker at conferences

  • Heisenbug Program Committee Member

Как со мной связаться?

Как будет проходить курс?

  • Лекции

  • Семинарские занятия

  • Домашние работы

  • Баллы за сдачу ДЗ определяют финальную оценку

Полезные ссылки

Полезные книги

horstmann
horstmann2
urma
  • Cay S. Horstmann. Core Java vol 1 & 2

  • Raoul-Gabriel Urma et al. Modern Java in Action

Полезные книги*

bloch
goetz
  • Joshua Bloch Effective Java

  • Brian Goetz et al. Java Concurrency in Practice

TIOBE Index

  • number of search engine results for queries containing the name of the language

  • covers searches in Google, Google Blogs, MSN, Yahoo!, Baidu, Wikipedia and YouTube

  • reflects the number of skilled engineers, courses and jobs worldwide

tiobe

RedMonk Index

  • GitHub & StackOverflow

redmonk2022

27 лет Джавы

JDK 1.0 (January 23, 1996)      |  -- 6-monthly release cadence --
JDK 1.1 (February 19, 1997)     |  Java SE 10     (March 20, 2018)
J2SE 1.2 (December 8, 1998)     |  Java SE 11 LTS (September 25, 2018)
J2SE 1.3 (May 8, 2000)          |  Java SE 12     (March 19, 2019)
J2SE 1.4 (February 6, 2002)     |  Java SE 13     (September 17, 2019)
J2SE 5.0 (September 30, 2004)   |  Java SE 14     (March 17, 2020)
Java SE 6 (December 11, 2006)   |  Java SE 15     (September 15, 2020)
-- Sun acquisition by Oracle--  |  Java SE 16     (March 16, 2021)
Java SE 7 (July 28, 2011)       |  Java SE 17 LTS (September 14, 2021)
Java SE 8 (March 18, 2014)      |  Java SE 18     (March 22, 2022)
Java SE 9 (September 21, 2017)  |  Java SE 19     (September 20, 2022)
                                |  Java SE 20     (due to in March 2023)
                                |  Java SE 21 LTS (due to in September 2023)

6-monthly Release Cadence

6 monthly

Истоки

gosling lotr
  • Язык для приставок кабельного телевидения

  • Вдохновлён C++

  • WORA

  • Было и другое, но WORA — самое главное

Q&A with James Gosling, June 2020: https://www.youtube.com/watch?v=XThhlihqTXI

Вопрос

Как бы вы реализовали WORA?

  • Endianness…​

  • Размер регистров…​

Продолжение истории

  • Апплеты

  • Built-in security

  • Но Security сделать оказалось непросто

  • Апплеты не пошли (победил JavaScript)

Сегодняшний день

  • Desktop (?)

  • Embedded Systems

  • Server-side (backend)

  • Mobile Devices (Android) — отдельная история (see Google vs. Oracle case)

Безопасность в design-time и в run-time

rtvscompiletime

Виртуальная машина

WORA + Две взаимосвязанные задачи:

  • Безопасность

  • Исключение фатальных сбоев на сервере

Генерируем байт-код, верифицируем и исполняем его в безопасной среде

Вопрос

int i = 2;
i = ++i + ++i + ++i;

Java — 12,
C — undefined behaviour
(https://stackoverflow.com/questions/3879176/i-i-i-in-java-vs-c)

Runtime-ошибки не катастрофичны

  • NullPointerException

  • ArrayIndexOutOfBoundsException

Виртуальные машины Java

Reference implementation: Oracle HotSpot

~ 20 реализаций

Сервисы виртуальной машины и платформы

  • Byte code, интерпретация и JIT-компиляция.

  • Garbage Collection

  • MultiThreading & Memory Model

  • Загрузка и исполнение кода в runtime

  • Рефлексия

  • Стандартная библиотека

Верификация байт-кода

  • There are no operand stack overflows or underflows.

  • All local variable uses and stores are valid.

  • The arguments to all the Java Virtual Machine instructions are of valid types.

Интерпретация и JIT-компиляция

java bytecode exec

Оптимизация «на лету»

codecache

Garbage Collection

  • Разработчику не нужно заботиться о высвобождении памяти

  • Ссылок на объект нет? — garbage collection

  • Достоинства:

    • Меньше кода

    • Не бывает некорректных ссылок (на разрушенный объект)

    • Меньше утечек памяти

  • Недостатки:

    • Не контролируем время работы GC

    • STW-паузы (бывает, в неподходящий момент)

Как может быть устроен GC?

  • Reference counting — циклы?

  • Mark & sweep

  • Гипотеза поколений

Гипотеза поколений

generations

Типы коллекторов

  • Serial (for single-threaded, client environments)

  • Parallel (default)

  • CMS (Concurrent mark and Sweep — shorter pauses, share processor resources)

  • G1 (Garbage First — big heaps)

  • Shenandoah (submillisecond pauses)

  • Epsilon (no GC)

Latency vs. Throughput tradeoff

seesaw

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

  • Возможность запуска параллельных потоков выполнения встроена в язык с первой версии (Thread, Runnable etc)

  • JDK 1.5: существенные дополнения (executor, semaphore, mutex, barrier, latches, concurrent collections, blocking queues)

  • JDK 1.7: ForkJoinPool (work-stealing technique)

  • JDK 1.8: CompletableFuture

  • Будущее: Project Loom: lightweight user-mode threads (fibers)

Модель памяти

  • Memory Model: часть спецификации VM: модель того, как работает хранилище данных

  • Отвечает на вопрос: «какие значения может прочитать конкретный read в программе?»

Когда нужна memory model?

class DumbWayToFallAsleep implements Runnable {
  private boolean asleep;

  public void setAsleep(boolean asleep){
    this.asleep = asleep;
  }

  @Override
  public void run() {
    while (!asleep){
      //countSomeSheep
      //УСНЁМ ЛИ МЫ?
    }
  }
}

Когда нужна memory model?

class NotSoDumbWayToFallAsleep implements Runnable {
  private volatile boolean asleep;

  public void setAsleep(boolean asleep){
    this.asleep = asleep;
  }

  @Override
  public void run() {
    while (!asleep){
      //countSomeSheep
      //...
    }
  }
}

Загрузка и исполнение кода в runtime

  • Скомпилированный байт-код класса может быть доставлен на любую систему в runtime (чаще всего «подкладыванием файла» на файловую систему).

  • Пересборка/линковка не требуется.

Сериализация объектов, встроенная в язык

  • Идея, в начале казавшаяся очень хорошей!

Рефлексия

  • Исследование информации о классах, полях, методах и т. д. во время выполнения

  • Чтение/модификация полей (в том числе private!) и динамический вызов методов (в том числе private!)

  • Proxy и AOP

Стандартная библиотека

lib evolution

Стандартная библиотека

  • Независимая от системы часть

    • Структуры данных

    • Математика

  • Зависимая от системы часть

    • Дата и время

    • Доступ к файловой системе

    • Доступ к сети

    • Пользовательский интерфейс

Обратная совместимость

  • Любой, как угодно давно скомпилированный .jar-файл может быть запущен на любой современной JVM

  • Дар или проклятие?

javasirs

Развитие языка, начиная с восьмой версии

  • lambdas & functional programming,

  • modules,

  • compact strings,

  • type inference,

  • switch expressions,

  • pattern matching,

  • records…​

Текущие проекты

  • Project Amber: productivity-oriented features

  • Project Loom: fibers & continuators

  • Project Valhalla: value types & generic specialization

  • Graal, Panama, Kulla, Sumatra…​

Битва за новые возможности

  • Алексей Шипилёв, 2015: The Lord of the Strings: Two Scours

  • Тагир Валеев, 2018: Pattern matching и его воображаемые друзья

  • Сергей Куксенко, 2020: Valhalla is coming

  • Сергей Куксенко, 2020: Java threads are losing weight, performance review of Project Loom

pirates

Разнообразие языков для Java-машины

Важнейшие элементы экосистемы

  • Бибилиотеки и фреймворки (в т. ч. для тестирования)

  • Среды разработки

  • Системы сборки

  • CI

JUnit

модульное тестирование и автоматизация тестов

junit5

Spring Framework

DI container and application framework,

springframework

Среды разработки

IntelliJ IDEA Logo IDEA
(proprietary, JetBrains)

Apache NetBeans Logo NetBeans
(ASF / Oracle)

Eclipse Luna Logo
Eclipse Foundation

Системы сборки

mavenlogo
  • XML-конфигурация, Maven project layout, Maven Central

gradlelogo
  • Groovy/Kotlin DSL

Jenkins CI

jenkins logo title

Java community

  • JUGs (Москва, Санкт-Петербург, Новосибирск)

  • Conferences (Joker, JPoint)

  • Приходите на московский JUG (когда закончится пандемия)

jugmsk

Oracle certification exams

  • OCA/OCP

Hello, world!

Cборка и запуск jar-файла