Core Java. Лекция 1

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

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

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

  • 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 (https://www.tiobe.com/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

RedMonk

  • GitHub & StackOverflow

Three Decades of Java: Before Java 9

JDK 1.0 (January 23, 1996)
JDK 1.1 (February 19, 1997)
J2SE 1.2 (December 8, 1998)
J2SE 1.3 (May 8, 2000)
J2SE 1.4 (February 6, 2002)
J2SE 5.0 (September 30, 2004)   <--- Scala: early 2004
Java SE 6 (December 11, 2006)
-- Sun acquisition by Oracle--  <--- Groovy 1.0: January 2, 2007
Java SE 7 (July 28, 2011)
Java SE 8 (March 18, 2014)      <--- Kotlin 1.0: February 15, 2016
Java SE 9 (September 21, 2017)

(source: Wikipedia)

Three Decades of Java: After Java 9

6-monthly release cadence

10     (March 20, 2018)
11 LTS (September 25, 2018)
12     (March 19, 2019)
13     (September 17, 2019)
14     (March 17, 2020)
15     (September 15, 2020)
16     (March 16, 2021)
17 LTS (September 14, 2021)
18     (March 22, 2022)
19     (September 20, 2022)
20     (March 21, 2023)
21 LTS (September 19, 2023)
22     (March 19, 2024)
23     (due to in September 2024)
24     (due to in March 2025)
25 LTS (due to in September 2025)

(source: Wikipedia)

Истоки

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

  • Java SE 21: Project Loom: virtual threads

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

  • 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

Постоянно совершенствуемая стандартная библиотека

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

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

    • Математика

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

    • Дата и время

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

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

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

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

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

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

Критика языка и платформы Джава

  • Тормозит

  • Потребляет слишком много памяти

  • Медленно стартует

  • Многословна (слишком много "boilerplate code")

  • Язык консервативен, медленно развивается

Критика языка и платформы Джава

  • Тормозит — нет

  • Потребляет слишком много памяти — нет

  • Медленно стартует — отчасти да

  • Многословна (слишком много "boilerplate code") — что да то да, но с Lombok и современной джавой это чинится

  • Язык консервативен, медленно развивается — уже нет

Развитие языка c 9й версии (6-months release cadence)

  • type inference,

  • switch expressions,

  • sealed classes,

  • pattern matching,

  • records,

  • unnamed main classes,

  • string templates (to be dropped?)…​

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

  • 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

vscode

VS Code

(Microsoft)

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

mavenlogo

XML configuration
Maven project layout
Maven Central
plugins
declarative

gradlelogo

Groovy DSL / Kotlin DSL
plugins
scripts
mixed declarative/imperative

Java community

  • JUGs (в крупных городах)

  • Conferences (Joker/JPoint/SnowOne, DevoXX etc.)

duke

Oracle certification exams

OCA/OCP (search for "Oracle Java Certification")

oca

Hello, world!

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